发布
社区首页 >问答首页 >执行器服务关机与shutdownNow的区别

执行器服务关机与shutdownNow的区别
EN

Stack Overflow用户
提问于 2012-07-17 10:02:09
回答 3查看 60.3K关注 0票数 83

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

据我所知,

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

shutdownNow()会突然关闭,这意味着一些未完成的任务被取消,而未启动的任务也被取消。还有什么东西是我遗漏的吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-17 10:05:14

总之,你可以这样想:

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

您可以尝试下面的示例并将shutdown替换为shutdownNow,以更好地理解不同的执行路径:

  • 对于shutdown,输出是Still waiting after 100ms: calling System.exit(0)...,因为正在运行的任务是,而不是中断并继续运行。
  • 对于shutdownNow,输出是interruptedExiting normally...,因为正在运行的任务被中断,捕获中断,然后停止它正在执行的操作(中断while循环)。
  • 使用shutdownNow时,如果注释掉while循环中的行,就会得到Still waiting after 100ms: calling System.exit(0)...,因为中断不再由正在运行的任务处理。
代码语言:javascript
代码运行次数: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...");
}
票数 153
EN

Stack Overflow用户

发布于 2015-09-15 10:00:33

  • shutdown()

要终止ExecutorService中的线程,您可以调用它的shutdown()方法。ExecutorService不会立即关闭,但它将不再接受新任务,一旦所有线程都完成了当前任务,ExecutorService就会关闭。调用关机()之前提交给ExecutorService的所有任务都将被执行。

  • shutdownNow()

如果要立即关闭ExecutorService,可以调用shutdownNow()方法。这将尝试立即停止所有执行任务,并跳过所有已提交但未处理的任务。对于执行的任务,没有任何保证。也许他们停止了,也许执行到最后。这是最大的努力尝试。

票数 9
EN

Stack Overflow用户

发布于 2012-07-17 10:06:04

来自javadocs

void shutdown 启动有序关机,执行以前提交的任务,但不接受任何新任务。 List<Runnable> shutdownNow() 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 除了尽力停止处理积极的执行任务之外,没有任何保证是肯定的。 例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。 返回:从未开始执行的任务列表

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11520189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档