繁体   English   中英

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

[英]How to wait until all submitted tasks in ExecutorService are completed without shutdown?

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

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. 将结果发送到某个地方

结果取决于后台处理,因此第3页应等待所有任务完成。 我知道可以通过shutdown()awaitTermination()的组合来实现,但是我不想关闭服务。 也可以调用invokeAll(List tasks) ,但是如您所见,在遍历期间会逐个创建任务。

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

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

您可以存储期货:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM