2016-06-21 2 views
0

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

Первое первых, моя проблема заключается в том, что я хочу, чтобы обновить один JSON файл , когда все потоки выполняются с генерацией растровый по определенному пути так , что я могу получить, что все эти изображения и обновления файла JSON. Итак, в простое слово my Я хочу запустить код, когда весь поток выполняется с ним Выполнение и основное требование заключается в том, что из-за этого я не хочу, чтобы мой главный блокировался.

Что я обнаружил

  • нить. присоединиться
  • excutorServive
  • Android-приоритетов jobQueue (link)
  • мьютекса в ThreadPool (также дайте мне знать, если есть другой)

Я смущен, который является лучшим способом борьбы с моя проблема. если есть специалист по андроиду там может подвести итог, что для следующих двух scenerio, что является лучшим в андроиде.

  • ждать, пока, когда все нити завершает
  • не ждать и получать информацию, когда все завершается

ответ

0

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

+0

Вы можете быть немного более наглядным в использовании. я не знаю, сколько потоков будет работать. это тоже переменная. поскольку я не знаю, сколько будет растрового поколения. Во-вторых, я хочу, чтобы он полностью независимый модуль из моего приложения. Как узнать, что поток завершен? для этого мне нужно иметь цикл while в одном потоке (исправьте меня, если я ошибаюсь) – RATHI

+0

@RATHI расширяет ответ KgaboL, в тот же момент, когда вы начинаете поток, вы можете увеличить счетчик (установленный в статическом классе, если хотите). Когда поток заканчивается, уменьшите этот счетчик и проверьте, равен ли он нулю. Когда он будет равен нулю, это будет означать, что все потоки исчезли. Вам все равно нужно учитывать, что происходит, когда набор потоков больше не нужен (ленивая загрузка некоторых изображений, которые больше не отображаются на экране, например), например, чтобы убедиться, что окончательное задание не будет выполнено, если вы снова не создадите потоки , или что-то типа того. – Korcholis

+0

@Korcholis благодарит за ответ, что можно использовать для этого подхода, я думаю, чтобы пойти с исполнителем пула потоков. на самом деле я запутался в этом, не хочу снова перейти к другому подходу позже в будущем. – RATHI

0

Вы можете сделать это вот так.

В вашей теме:

private Runnable runnableThread= new Runnable() { 
    @Override 
    public void run() { 
     try { 
      if (lastThreadDone){ 
       handler.sendEmptyMessage("SUCCESS"); 
      } 
     } 
     catch (Exception ex) { 
      throws ex; 
     } 
    } 
}; 

lastThreadDone является булево, который будет верно, если процесс будет сделано, это основа того, как вы ее реализации.

тогда в вас обработчик:

@SuppressLint("HandlerLeak") 
private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     try { 
      switch (msg.what) { 
       case "SUCCESS": { 
        // your code here 
        break; 
       } 
       case "FAIL": 
        break; 
       default: 
        break; 
      } 
     } 
     catch (Exception ex) { 
      throw ex; 
     } 
     super.handleMessage(msg); 
    } 
}; 
+0

Это вопрос Я думаю, что как вы узнаете, что последняя нить завершена? это не всегда, что последний поток, который был поставлен в очередь, будет последним. не так ли? пусть предположим, что я начал 6 потоков, и в конце всех этих шести я должен получить это сообщение. поэтому я могу думать о том, что у меня может быть mutex on count, и когда каждый поток выполняется с выполнением, я могу уменьшить этот счет, и когда последний поток работает в это время, я могу отправить это сообщение обработчику. но для этого требуется много параллелизма, который мне нужно обрабатывать. – RATHI

+0

Я думаю, что это хорошо известная проблема, и должен быть хороший способ легко справиться с этой задачей в Android. исправьте меня, если я не слишком много от android. : P – RATHI

+0

больше всего похоже на ограничение для потоков прямо сейчас. Я рекомендую попробовать Asynctask, более подходящее решение для вашей проблемы, см. здесь http://stackoverflow.com/a/24228697/5870896 –

0

Я бы использовать completion service, а затем опрос, пока все задачи не будут завершены. Когда они будут выполнены, файл json будет обновлен. Проблема в том, что вам нужно сделать это async или вы рискуете заблокировать ui. Поэтому я должен инкапсулировать работу с помощью службы завершения внутри intent service. Если вам нужно обновить ui, вы можете отправить local broadcasts из службы намерений.

Кроме того, для вас случаев

  • ждать, пока, когда все нити завершают

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

    • влечет за собой вышеуказанный случай. Выполняйте работу async и уведомляйте ui или какой-либо компонент прослушивания с широковещательными передачами, content observers, handlers или «onPostExecute», если вы используете async task.
+0

Благодарим за ответ. Это выглядит многообещающим, но из этого потока: «В основном вы используете CompletionService, если хотите выполнять несколько задач параллельно, а затем работать с ними в их завершении Итак, если я выполнил 5 заданий, то CompletionService предоставит мне первый, который завершится », мне не нужен каждый мудрый результат для каждого потока, я хочу получить информацию о том, что они закончены. – RATHI

+0

будет пул потоков внутри услуга намерения также является хорошим вариантом? – RATHI

+0

Несомненно, что бы ни подходило. Что касается службы завершения, она возвращает завершенную первую задачу, но вы можете тянуть столько раз, сколько вы отправили задачу. Когда вытягивающий счетчик соответствует счетчику отправки, вы знаете, что каждая задача выполнена. При использовании службы намерения помните, что служба намерения уничтожается после выполнения, поэтому не полагается на какое-либо состояние. – GPuschka

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