1

可能的重复:
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!")
4

2 回答 2

7

对于您的所有任务,将它们放入 List 可调用对象中,然后在它们上调用所有

ExecutorService e = ...

e.invokeAll(callables);

根据 javadocs

执行给定的任务,返回一个 Futures 列表,在所有完成时保存它们的状态和结果。Future.isDone() 对于返回列表的每个元素都是 true。请注意,已完成的任务可能已经正常终止,也可能通过引发异常终止。如果在此操作进行时修改了给定的集合,则此方法的结果是不确定的。

因此线程将等待直到所有任务都完成

于 2011-06-16T18:12:26.553 回答
3

您可以使用将ThreadPoolExecutor池大小设置为Java 6Java 8的 a以及要执行的所有任务,然后调用并等待 a which blocks 完成所有提交的任务。对您的实例的引用在哪里。System.getRuntime().availableProcessors()Runtime.getRuntime().availableProcessors().execute()tpe.shutdown()while(!tpe.terminated()) { /* waiting for all tasks to complete */}tpeThreadPoolExecutor

或者,如果更合适,请使用ExecutorCompletionService使用提供的 Executor 执行任务的CompletionService 。此类安排提交的任务在完成后放置在使用 take 可访问的队列中。该类足够轻量级,适合在处理任务组时临时使用。

于 2011-06-16T15:57:17.740 回答