shutdown()
我想知道关闭和shutdownNow()
关闭的基本区别Executor Service
?
据我了解:
shutdown()
应该用于正常关闭,这意味着所有正在运行并排队等待处理但未启动的任务应该被允许完成
shutdownNow()
突然关闭意味着一些未完成的任务被取消,未启动的任务也被取消。还有什么我遗漏的隐式/显式的吗?
PS:我发现了另一个关于如何关闭与此相关的执行程序服务的问题,但不完全是我想知道的。
shutdown()
我想知道关闭和shutdownNow()
关闭的基本区别Executor Service
?
据我了解:
shutdown()
应该用于正常关闭,这意味着所有正在运行并排队等待处理但未启动的任务应该被允许完成
shutdownNow()
突然关闭意味着一些未完成的任务被取消,未启动的任务也被取消。还有什么我遗漏的隐式/显式的吗?
PS:我发现了另一个关于如何关闭与此相关的执行程序服务的问题,但不完全是我想知道的。
总之,你可以这样想:
shutdown()
只会告诉执行器服务它不能接受新任务,但是已经提交的任务会继续运行shutdownNow()
会做同样的事情并且会尝试通过中断相关线程来取消已经提交的任务。请注意,如果您的任务忽略中断,其shutdownNow
行为方式将与shutdown
.您可以尝试下面的示例并替换shutdown
为shutdownNow
以更好地了解不同的执行路径:
shutdown
输出是Still waiting after 100ms: calling System.exit(0)...
因为正在运行的任务没有中断,继续运行。shutdownNow
,输出是interrupted
andExiting normally...
因为正在运行的任务被中断,捕获中断然后停止它正在做的事情(打破 while 循环)。shutdownNow
如果你注释掉while循环中的行,你会得到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 中的线程,您可以调用它的shutdown()
方法。ExecutorService 不会立即关闭,但不会再接受新任务,一旦所有线程完成当前任务,ExecutorService 就会关闭。在调用 shutdown() 之前提交给 ExecutorService 的所有任务都会被执行。
shutdownNow()
:如果要立即关闭ExecutorService,可以调用该shutdownNow()
方法。这将尝试立即停止所有正在执行的任务,并跳过所有已提交但未处理的任务。对执行任务没有任何保证。也许他们会停下来,也许会执行到最后。这是一个尽力而为的尝试。
从javadocs:
void shutdown
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。
List<Runnable> shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。
除了尽最大努力停止处理正在执行的任务之外,没有任何保证。
例如,典型的实现将通过 Thread.interrupt() 取消,因此任何未能响应中断的任务可能永远不会终止。
返回:从未开始执行的任务列表