如何等到ExecutorService中的所有提交的任务都完成而没有关闭?

时间:2015-06-28 10:02:47

标签: java executorservice executors

想象一下,我们遍历一个集合并提交要在后台运行的任务

class Processor {
    public void process(Iterable<Item> items, ExecutorService executorService) {
       for (Item item : items) {               
           doStandardProcess(item);               
           if (needSpecialProcess(item)) {
               executorService.submit(createSpecialTaskFor(item));
           }
       }
    }
}

程序流程如下:

  1. 从某个地方收到物品
  2. 创建处理器并处理它们
  3. 将结果发送到某个地方
  4. 结果取决于后台处理,因此p.3应该等到所有任务完成。我知道它可以通过shutdown()awaitTermination()的组合来实现,但我不想关闭该服务。此外,还可以调用invokeAll(List tasks),但如您所见,在遍历期间逐个创建任务。

    如何在给定限制下等待完成?

    P.S。如果不清楚,另一个限制是与项目遍历并行运行后台任务,因为后台任务比基本处理操作多花费100倍的时间。

2 个答案:

答案 0 :(得分:1)

您可以存储期货:

List<Future> futures = new ArrayList<> ();
//in the for loop
futures.add(executorService.submit(createTaskFor(item)));

//after for loop + add exception handling
for (Future f : futures) f.get();
//at this point all tasks have finished

答案 1 :(得分:0)

List<Callable<Foo>> toProcess = new ArrayList<>();
for (Item item : items) {
    if (needProcess(item)) {
        toProcess.add(createTaskFor(item));
    }
}
executorService.invokeAll(toProcess);