如何关闭 CompletionService

How can I shutdown CompletionService

我需要做这样的事情:

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

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

我怎样才能让它停止?

有什么方法可以停止ExecutorService,等待当前正在执行的任务完成吗?

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

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

shutdown()方法只会停止接受新任务,但已经执行的任务将继续执行。


"Is there are any way to stop ExecutorService but waiting for completion currently executed tasks?"

更新

我能想到的一个选项是-

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

ExecutorService 将继续执行 已提交的任务,但不允许提交更多任务,来自 documentation

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. Invocation has no additional effect if already shut down.
emphasis mine

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

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

Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution.
emphasis mine

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

N.B.: 停止任务进行中完全是另一个问题。