如何在不关闭的情况下等待ExecutorService中所有提交的任务完成



假设我们遍历一个集合并提交要在后台中运行的任务

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

结果取决于后台处理,所以p.3应该等到所有任务都完成。我知道shutdown()awaitTermination()的组合可以实现,但我不想关闭服务。也可以调用invokeAll(List tasks),但正如您所看到的,任务是在遍历过程中逐个创建的。

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

附言:如果不清楚,另一个限制是在项目遍历的同时运行后台任务,因为后台任务比基本处理操作多花费x100的时间。

您可以存储期货:

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);

相关内容

  • 没有找到相关文章

最新更新