блокировать, пока ExecutorService не будет выполнен

Возможные дубликаты:
ExecutorService , как дождаться завершения всех задач
Java ExecutorService: awaitTermination всех рекурсивно созданных задач

Есть ли способ заблокировать текущий поток, пока ExecutorService не завершит все свои задачи?

executor.execute(task1);
executor.execute(task2);
executor.execute(task3);
executor.execute(task4);
executor.execute(task5);
// ...now I want to block until all tasks have finished executing...
System.out.println("done!")

person fredoverflow    schedule 16.06.2011    source источник
comment
используйте invokeAll, а затем вызовите get для возвращенных Future объектов ... аналогично Thread.join().   -  person mre    schedule 16.06.2011


Ответы (2)


Вы можете использовать ThreadPoolExecutor с размер пула установлен на _2 _ Java 6 или _ 3_ Java 8 и .execute() все задачи, которые вы хотите выполнить, затем вызовите tpe.shutdown() и затем ждите в while(!tpe.terminated()) { /* waiting for all tasks to complete */}, который блокирует выполнение всех отправленных задач. где tpe - ссылка на ваш ThreadPoolExecutor экземпляр.

Или, если это более уместно, используйте ExecutorCompletionService CompletionService, использующий предоставил Executor для выполнения задач. Этот класс организует то, что отправленные задачи после завершения помещаются в очередь, доступную с помощью take. Класс достаточно легкий, чтобы быть пригодным для временного использования при обработке групп задач.

person Community    schedule 16.06.2011
comment
while(!tpe.terminated()) {} занят-ждет. - person subsub; 27.09.2013

Для всех ваших задач поместите их в список вызываемых объектов, затем вызовите для них All

ExecutorService e = ...

e.invokeAll(callables);

По javadocs

Выполняет заданные задачи, возвращая список Futures с их статусом и результатами, когда все выполнено. Future.isDone () истинно для каждого элемента возвращенного списка. Обратите внимание, что завершенная задача могла быть завершена либо обычным образом, либо с помощью исключения. Результаты этого метода не определены, если данная коллекция изменена во время выполнения этой операции.

Таким образом, поток будет ждать, пока все задачи не будут выполнены.

person John Vint    schedule 16.06.2011