我想知道关闭
shutdown()
和shutdownNow()
之间的基本区别?据我了解:
Executor Service
应用于
graceful关闭,这意味着所有正在运行并排队等待处理但尚未启动的任务都应该被允许完成
shutdown()
会“突然”关闭,这意味着一些未完成的任务被取消,未启动的任务也被取消。还有什么我遗漏的隐式/显式的吗?
P.S:我发现了另一个与此相关的问题“如何关闭执行程序服务”,但不完全是我想知道的。
shutdown()
尝试取消已提交的任务。请注意,如果您的任务忽略中断,
shutdownNow()
shutdownNow
完全相同。
您可以尝试下面的示例,并将
shutdown
替换为
shutdown
使用
shutdownNow
,输出为
shutdown
,因为正在运行的任务Still waiting after 100ms: calling System.exit(0)...
,输出为 shutdownNow
和 interrupted
Exiting normally...
,如果您注释掉 while 循环中的行,您将得到 shutdownNow
,因为正在运行的任务不再处理中断。Still waiting after 100ms: calling System.exit(0)...
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("interrupted");
break;
}
}
}
});
executor.shutdown();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting after 100ms: calling System.exit(0)...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
:shutdown()
方法。 ExecutorService不会立即关闭,但它不会再接受新任务,一旦所有线程完成当前任务,ExecutorService就会关闭。在调用 shutdown() 之前提交给 ExecutorService 的所有任务都会被执行。
shutdown()
:
shutdownNow()
方法。这将尝试立即停止所有正在执行的任务,并跳过所有已提交但未处理的任务。对于正在执行的任务不提供任何保证。也许他们会停下来,也许会执行到最后。这是尽最大努力的尝试。
来自
javadocs: