Нить и аккумулятор - PullRequest
       1

Нить и аккумулятор

0 голосов
/ 21 июля 2011

У меня есть 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.

1 Ответ

0 голосов
/ 16 марта 2012

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

Однако, глядя на то, что вы там делаете, похоже, вы захотите заглянуть в подкласс BlockingQueue .

...