可能重复:
ExecutorService, how to wait for all tasks to finish
Java ExecutorService: awaitTermination of all recursively created tasks
在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!")
答案 0 :(得分:7)
对于您的所有任务,将它们放入List callables然后在它们上调用它们
ExecutorService e = ...
e.invokeAll(callables);
每个javadocs
执行给定的任务,返回一个 期货持有人名单 全部完成后的结果。 Future.isDone()对每个都是正确的 返回列表的元素。注意 完成的任务可能有 正常或通过终止 抛出一个例外。结果 如果给定,此方法是未定义的 集合在此时被修改 正在进行中。
因此,线程将等待所有任务完成
答案 1 :(得分:3)
您可以使用ThreadPoolExecutor
,其池大小设置为System.getRuntime().availableProcessors()
Java 6 或Runtime.getRuntime().availableProcessors()
Java 8 和{{ 1}}您要执行的所有任务,然后调用.execute()
然后在tpe.shutdown()
中等待阻止所有提交的任务完成。 其中while(!tpe.terminated()) { /* waiting for all tasks to complete */}
是对tpe
实例的引用。
或者如果更合适,请使用ExecutorCompletionService A CompletionService使用提供的Executor执行任务。该类安排提交的任务在完成后放置在可使用take访问的队列中。该类足够轻巧,适合在处理任务组时暂时使用。