我需要做这样的事情:
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但是等待当前正在执行的任务完成?
答案 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方法返回时,您需要将任务存储在列表中。