Как ожидать всех потоков для окончания, с помощью ExecutorService?

Спасибо всем за ваш вклад и помощь. Теперь я запускаю функцию непосредственно на элементе, как вы все предложили.

Однако я обнаружил проблему. Как я дурачок ?? У меня была ссылка на мой файл .js дважды в моем HTML-файле макета. Duuh for me !!

Еще раз спасибо всем, что нашли время помочь мне!

Best !!

360
задан bluish 24 November 2011 в 20:41
поделиться

7 ответов

Обычно на ExecutorService вы вызываете shutdown () , а затем awaitTermination () :

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
  taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}
425
ответ дан 23 November 2019 в 00:15
поделиться

если Вы используете больше потока ExecutionServices ПОСЛЕДОВАТЕЛЬНО и хотите ожидать КАЖДЫЙ EXECUTIONSERVICE, который будет закончен. Лучший способ похож ниже;

ExecutorService executer1 = Executors.newFixedThreadPool(THREAD_SIZE1);
for (<loop>) {
   executer1.execute(new Runnable() {
            @Override
            public void run() {
                ...
            }
        });
} 
executer1.shutdown();

try{
   executer1.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

   ExecutorService executer2 = Executors.newFixedThreadPool(THREAD_SIZE2);
   for (true) {
      executer2.execute(new Runnable() {
            @Override
            public void run() {
                 ...
            }
        });
   } 
   executer2.shutdown();
} catch (Exception e){
 ...
}
0
ответ дан 23 November 2019 в 00:15
поделиться

Используйте CountDownLatch :

CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
  taskExecutor.execute(new MyTask());
}

try {
  latch.await();
} catch (InterruptedException E) {
   // handle
}

и в своей задаче (заключите в try / finally)

latch.countDown();
167
ответ дан 23 November 2019 в 00:15
поделиться

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

taskExecutor.execute(new Runnable() {
  public void run() {
    taskStartedNotification();
    new MyTask().run();
    taskFinishedNotification();
  }
});
5
ответ дан 23 November 2019 в 00:15
поделиться

Класс CyclicBarrier в Java 5 и более поздних версиях предназначен для такого рода вещей.

12
ответ дан 23 November 2019 в 00:15
поделиться

ExecutorService.invokeAll () сделает это за вас.

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
List<Callable<?>> tasks; // your tasks
// invokeAll() returns when all tasks are complete
List<Future<?>> futures = taskExecutor.invokeAll(tasks);
82
ответ дан 23 November 2019 в 00:15
поделиться

Вы можете использовать свой собственный подкласс ExecutorCompletionService , чтобы обернуть taskExecutor ,

1
ответ дан 23 November 2019 в 00:15
поделиться