2017-02-10 19 views
1

Эй, вот интересный вопрос. Я использую в своем проекте Android множество операций sql с sqlite. По этому вопросу я использую пул потоков для повторного использования существующих ресурсов. Пул потоков выглядеть как это:Android с использованием нескольких threadpoolexecutors

final int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors(); 
ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(NUMBER_OF_CORES*2,NUMBER_OF_CORES*2,1L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(12,true),new PriorityThreadFactory(Process.THREAD_PRIORITY_BACKGROUND),new RejectedThread(context)); 



public class PriorityThreadFactory implements ThreadFactory { 

    private final int mThreadPriority; 

    public PriorityThreadFactory(int threadPriority) { 
     mThreadPriority = threadPriority; 
    } 

    @Override 
    public Thread newThread(final Runnable runnable) { 
     Runnable wrapperRunnable = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        android.os.Process.setThreadPriority(mThreadPriority); 
       } catch (Throwable t) { 

       } 
       runnable.run(); 
      } 
     }; 
     return new Thread(wrapperRunnable); 
    } 

    } 




public class RejectedThread implements RejectedExecutionHandler { 

    MyLogger myLogger; 

    public RejectedThread(Context context) { 
     this.myLogger=new MyLogger(RejectedThread.class.getSimpleName(), context); 
    } 

    @Override 
    public void rejectedExecution(Runnable worker, ThreadPoolExecutor executor) { 
     this.myLogger.info("Execution rejected for: "+worker.toString()); 
    } 
} 

А также я создаю новый Runnable для каждого CRUD (Create-Read-Update-Delete) операция, которую я делаю в базе данных (выполняется с помощью пула потоков выше) , Вот вопросы, помимо threadpool для операций sql, мне понадобится еще один пул потоков для выполнения операций регистрации, чтобы регистрировать поведение системы для остальных моих функций, которые я делаю. Есть ли способ предотвратить раздачу/(недостаточные ресурсы), потому что я использую два или более исполнителей пула потоков (выделенные разделенные, используя в разных целях и никогда выполнение исполнителя пула потоков в другом исполнителе пула потоков)?

+0

Это все кажется излишним. Зачем вам нужен пул потоков для операций регистрации? Также почему вы не можете использовать существующего исполнителя из класса AsyncTask? У вас есть проблемы с этим? – Okas

+0

не все операции 'CRUD' будут синхронизированы в любом случае? –

+0

[Okas] Все эти журналы отправляются службе, поэтому эта операция всегда находится в фоновом режиме. Я пытаюсь выполнить что-то вроде: Firebase Crash Reporting (https://firebase.google.com/docs/crash/), но используя мой единственный персональный сервер и с меньшими функциональными возможностями. –

ответ

1

Я думаю, что в целом ваша идея очень хорошая, но ваша реализация немного неэффективна.

Попробуйте ответить на эти вопросы для себя:

  • Зачем вам два пулы потоков?
  • Вам действительно нужны два пула потоков?
  • Почему вы устанавливаете размер CORE в NUMBER_OF_CORES * 2?
  • Зачем устанавливать размер MAX в NUMBER_OF_CORES * 2?
  • Вам действительно нужно перезаписать приоритеты потоков?

По моему опыту, ни одно из вышеуказанных осложнений действительно не требуется.

Например, во всех моих приложениях я использую один экземпляр класса BackgroundThreadPoster, чтобы разгрузить работу в фоновый поток. Класс очень прост:

/** 
* A single instance of this class should be used whenever we need to post anything to a (random) background thread. 
*/ 
public class BackgroundThreadPoster { 

    ExecutorService mExecutorService = Executors.newCachedThreadPool(); 

    public void post(Runnable runnable) { 
     mExecutorService.execute(runnable); 
    } 
} 

По умолчанию предварительно сконфигурированный реализация возвращаемый Executors.newCachedThreadPool() работ, как магия, и я никогда не сталкивался с какой-либо необходимости настраивать ее параметры.

Полное приложение учебник, который использует этот подход, можно найти здесь: https://github.com/techyourchance/android_mvc_tutorial

Может быть, это может работать для вас тоже?

+0

Спасибо за ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^