阻止,直到ExecutorService完成

时间:2011-06-16 15:49:46

标签: java multithreading concurrency blocking executorservice

  

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

2 个答案:

答案 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访问的队列中。该类足够轻巧,适合在处理任务组时暂时使用。