执行人服务的停机和shutdownNow时的区别(Difference between shutdo

2019-06-17 11:34发布

我想知道的基本区别shutdown()shutdownNow()用于关闭Executor Service ?据我了解shutdown()应该用于正常关闭,这意味着人乳宁,并排队等待处理,但尚未开始的所有任务应该可以完成和shutdownNow()不会突然关机意味着一些未完成的任务被取消,尚未启动的任务也被取消。 还有什么是隐性/明确的,我很想念?

PS:我发现了另一个问题,关于SO与此相关的,但不是我想知道到底是什么。

Answer 1:

综上所述,可以认为这样的说法:

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

你可以试试下面的例子中,更换shutdownshutdownNow更好地理解执行的不同的路径:

  • shutdown ,输出Still waiting after 100ms: calling System.exit(0)...因为正在运行的任务中断,继续运行。
  • shutdownNow ,输出interruptedExiting 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...");
}


Answer 2:

  • shutdown()

要终止调用其内部的ExecutorService线程shutdown()方法。 该ExecutorService的不会立即关闭,但将不再接受新的任务,而一旦所有线程都完成当前任务,在ExecutorService的关闭。 ()关闭之前提交给ExecutorService的所有任务被调用时,被执行。

  • shutdownNow()

如果你想立即关闭ExecutorService的,你可以调用shutdownNow()方法。 这将尝试停止所有正在执行的任务的时候了,并跳过所有提交,但不处理的任务。 没有关于执行任务作出的担保。 也许他们停下来,也许是执行,直到结束。 这是一个最好的努力尝试。



Answer 3:

从的javadoc :

void shutdown

在启动以前已提交任务的执行一个有序的关闭,但没有新的任务将被接受。

List<Runnable> shutdownNow()

尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务列表。

没有保证尽最大努力,试图积极停止处理执行任务。

例如,典型的实现将通过了Thread.interrupt(),从而无法对中断可能永远不会终止响应的任何任务取消。

返回:从未开始执行的任务列表



文章来源: Difference between shutdown and shutdownNow of Executor Service