Выполнять одновременные потоки и уведомлять, когда последний заканчивается (Android Java) - PullRequest
0 голосов
/ 09 июля 2011

Моя программа имеет: Одна деятельность Одна тяжелая задача, которую нужно выполнить, когда нажимается кнопка (из-за множества потоков - 10 скачиваний) Поэтому, когда кнопка нажата, я показываю диалог прогресса, и я делаю

onClick(){
  showDialog();
  for (int i=0;i<10;i++)
       download(i);   //download launches a new thread each call
  //wait without blocking the UI thread until last download end
       continue();
}

Какой самый лучший и простой способ сделать это? Большое спасибо заранее

Ответы [ 2 ]

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

Вы можете использовать CountDownLatch или CyclicBarrier .

Вы создаете CountDownLatch и инициализируете его с количеством потоков, которые вы запускаете, затемпередать его в каждую ветку загрузки.Когда поток загрузки завершает свою работу, он вызывает countDown для защелки.

Вы можете либо вызвать await для защелки из метода onClick (но это заблокирует этот поток, которыйзвучит так, как будто вы этого не хотите), или создаете один дополнительный поток, который просто вызывает await, блокируя ожидание всех потоков загрузки.Как только защелка открыта, вы можете выполнять любые действия, которые вам нужно сделать (например, закрыть диалоговое окно прогресса).

final CountDownLatch latch = new CountDownLatch(10);
for (int i=0;i<10;i++)
    download(i, latch);

Thread cleanup = new Thread( new Runnable() {
    public void run() {
        try{
            // This will block
            latch.await();
        } catch (InterruptedException e ) {
            // TODO
            e.printStackTrace();
        }
        takeDownDialog();
        whateverElseYouNeedToDo();
    }
});
cleanup.start();
0 голосов
/ 09 июля 2011

Вам понадобятся ссылки на все объекты 10 Thread.Скажем, как массив Thread [] tasks

, поэтому вам нужно вызвать функцию join() для ожидания (блокировки) завершения потока.

for(int i = 0 ; i < 10; i++)
      tasks[i].join();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...