我该如何关闭CompletionService

时间:2016-03-18 08:29:58

标签: java java.util.concurrent

我需要做这样的事情:

ExecutorService executor = Executors.newFixedThreadPool(2);
CompletionService<Boolean> completionService = new ExecutorCompletionService<>(executor);
int i = 0;
while (i < 40) {
  completionService.submit(getTask());
  i++;
}
executor.shutdown();
System.out.println("SHUTDOWN");

但是在shutdown对象executor上调用completionService后仍然执行任务。

如何让它停止?

是否有任何方法可以停止ExecutorService但是等待当前正在执行的任务完成?

2 个答案:

答案 0 :(得分:3)

ExecutorService将继续执行已提交的任务,但不允许从documentation

提交更多任务
  

启动有序关闭,其中先前提交的任务已执行,但不会接受任何新任务。如果已经关闭,调用没有额外的影响   强调我的

所以你已经提交了40个任务,这些任务将在关机前执行。

如果要强行关机。您可以使用shutdownNow

  

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。
  强调我的

将根据需要放弃计划任务。

N.B。:正在停止正在进行的任务是另一个问题。

答案 1 :(得分:2)

使用尝试停止已经执行任务的shutdownNow()。阅读此https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow()

已经执行的任务的关闭只是一次尝试,但不能保证停止。

shutdown()方法仅停止执行新任务,但已执行任务将继续执行。

更新&#34;是否有任何方法可以停止ExecutorService但是等待当前执行的任务完成?&#34;

我能想到的一个选择是 -

completionService.submit(getTask());类型的Future返回对象。您可以编写代码来检查任务isDone()。调用shutdownNow()后,您可以在isDone()的循环中检查任务。当通过submit方法返回时,您需要将任务存储在列表中。