关机和关机之间的区别执行器服务现在

2022-08-31 12:28:47

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

据我所知:

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

shutdownNow()突然关闭是否意味着一些未完成的任务被取消,未开始的任务也被取消。我错过了其他隐式/显式内容吗?

P.S:我发现了另一个关于如何关闭与此相关的执行器服务的问题,但并不完全是我想知道的。


答案 1

总之,你可以这样想:

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

您可以尝试以下示例并替换为,以更好地了解不同的执行路径:shutdownshutdownNow

  • ,则输出是因为正在运行的任务中断并继续运行。shutdownStill waiting after 100ms: calling System.exit(0)...
  • 与 ,输出是 并且因为正在运行的任务被中断,捕获中断,然后停止它正在执行的操作(中断 while 循环)。shutdownNowinterruptedExiting normally...
  • 如果注释掉 while 循环中的行,则会得到,因为中断不再由正在运行的任务处理。shutdownNowStill 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...");
}

答案 2
  • shutdown():

要终止执行器服务中的线程,请调用其方法。ExecutorService 不会立即关闭,但它将不再接受新任务,并且一旦所有线程都完成了当前任务,ExecutorService 将关闭。在调用 shutdown() 之前提交到 ExecutorService 的所有任务都将被执行。shutdown()

  • shutdownNow():

如果要立即关闭执行器服务,可以调用该方法。这将尝试立即停止所有正在执行的任务,并跳过所有已提交但未处理的任务。对执行任务没有保证。也许他们停止了,也许执行直到最后。这是一次尽力而为的尝试。shutdownNow()


推荐