У меня есть 1 проблема и 2 варианта реализации, и я хотел бы знать, какой из них является лучшим в среде Android (в основном лучшая практика, а какой использует меньше батареи).
Моя проблема:
У меня есть 4 реализации Runnable, в которых Runnable есть список задач, которые необходимо выполнить в отдельных потоках.
У этих Runnable не будет задачи в течение длительного периода времени, а затем будет выполнено много задач (каждый Runnable выполняет свои задачи в последовательном порядке), затем ничего не будет в течение длительного времени и так далее ...
1-я реализация
Моя первая реализация заключалась в создании 4 потока. Каждый поток заряжается по 1 Runnable. Каждый поток выполняет все задачи, когда список пуст. Runnable Pause потока (с помощью wait ()), когда в список добавляются другие задачи, поток активируется (с помощью notify ()).
Вот код метода run для Runnable:
public void run() {
while (!terminated) {
while ( taskList.size()> 0 ) {
Task task = taskList.get(0);
taskList.remove(task);
handleTask(task);
}
synchronized(taskList) {
if (taskList.size()==0)
taskList.wait();
}
}
}
Первый вопрос: находится ли поток в состоянии паузы с использованием большого количества ресурсов?
2-я реализация
Во второй реализации я подумал об использовании Executors.newCachedThreadPool () (как в реализации AsyncTask). По сути, я буду просить поток в пуле, когда у моего Runnable есть задачи для выполнения, и система отвечает за предоставление мне доступного потока и его уничтожение после определенного периода бездействия.
Поскольку у моего 4 Runnable будет длительный период без задач (кроме, может быть, 1 Runnable), я почти уверен, что поведение моего пула будет примерно таким:
- всегда 1 поток занят
- создать 1 тему, удалить 1 тему,
- создать 2 темы, удалить 2 шага,
- создать 1 тему ...
Потоки, вероятно, никогда не будут использоваться повторно (за исключением случаев, когда я установил действительно длительный период бездействия).
Так что же является лучшим вариантом? Имея только 4 потока, которые проводят большую часть своего времени в состоянии паузы или создают / уничтожают много потоков, но имеют их только тогда, когда они мне нужны.
Спасибо за помощь,
JimBoy.