gpt4 book ai didi

java - Executor Service的shutdown和shutdownNow的区别

转载 作者:IT老高 更新时间:2023-10-28 13:53:30 30 4
gpt4 key购买 nike

我想知道shutdown()shutdownNow()关闭Executor Service的基本区别?

据我所知:

shutdown() 应该用于 graceful 关闭,这意味着应该允许所有正在运行并排队等待处理但未启动的任务完成

shutdownNow() 会进行一次abrupt 关闭,这意味着一些未完成的任务被取消,未启动的任务也被取消。还有什么我遗漏的隐式/显式的吗?

P.S:我在 How to shutdown an executor service 上发现了另一个问题与此相关,但不完全是我想知道的。

最佳答案

总而言之,你可以这样想:

  • shutdown() 只会告诉执行器服务它不能接受新任务,但是已经提交的任务会继续运行
  • shutdownNow() 会做同样的事情,并且会通过中断相关线程来尝试取消已经提交的任务。请注意,如果您的任务忽略中断,shutdownNow 的行为方式将与 shutdown 完全相同。

你可以试试下面的例子,把 shutdown 换成 shutdownNow 来更好地理解不同的执行路径:

  • 使用shutdown,输出是Still waiting after 100ms: calling System.exit(0)... 因为正在运行的任务是not 中断并继续运行。
  • shutdownNow,输出是interruptedExiting normal...因为正在运行的任务被中断了,捕捉到中断然后停止它在做什么(打破 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...");
}

关于java - Executor Service的shutdown和shutdownNow的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11520189/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com