【问题标题】:Shutting down ExecutorService关闭 ExecutorService
【发布时间】:2015-11-18 02:52:48
【问题描述】:

根据documentation,当shutdown()被调用时,任何已经提交的任务(我假设通过submit()execute)都会被执行。当shutdownNow()被调用时,执行器会停止所有等待处理的任务,并尝试停止主动执行的任务。

我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行程序,我在一些 Runnable 对象上调用 execute()(假设所有这些对象都有效地忽略了中断)。我知道如果我现在调用shutdown,所有这些对象都将完成执行,无论如何。

但是,如果我此时调用shutdownNow,会不会和调用shutdown 有相同的效果?还是有些对象没有执行?换句话说,如果我希望执行程序尽快退出,我最好的选择是始终调用shutdownNow(),即使传递给执行程序的Runnables 都有效地忽略了中断?

【问题讨论】:

    标签: java multithreading interrupted-exception


    【解决方案1】:

    假设你有一个很棒的Runnable,它一旦启动就不会中断 10 秒:

    Runnable r = new Runnable() {
        @Override
        public void run() {
            long endAt = System.currentTimeMillis() + 10000;
            while (System.currentTimeMillis() < endAt);
        }
    };
    

    你有一个只有 1 个线程的 executor,你安排了 runnable 10 次:

    ExecutorService executor = Executors.newFixedThreadPool(1);
    for (int i = 0; i < 10; i++)
        executor.execute(r);
    

    现在你决定打电话给shutdown

    • 执行程序将持续整整 10 x 10 秒,所有计划的内容都将被执行。这些任务看不到您正在关闭它们的执行程序。 shutdown 如果你想要一个“短命”的执行器来完成一些任务,可以使用它。您可以立即致电shutdown,稍后会进行清理。

    或者shutdownNow():

    • 需要 10 秒。试图中断已经运行的任务,但这显然没有效果,所以它继续运行。仍在队列中等待的其他 9 个任务被“取消”并作为列表返回给您,以便您可以对它们做一些事情,比如稍后安排它们。如果第一个任务尚未开始,也可能需要 0 秒。你会得到所有的任务。每当您想中止整个执行程序时,都会使用该方法。

    【讨论】:

      【解决方案2】:

      我想澄清的是“等待处理”的确切含义。

      表示所有run()方法还没有被(执行者)调用的任务。

      如果此时我调用shutdownNow,会不会和调用shutdown有同样的效果?

      没有。

      还是有可能有些对象不会被执行?

      没错。

      换句话说,如果我希望执行程序尽快退出,我最好的选择是始终调用 shutdownNow(),即使传递给执行程序的 Runnables 都有效地忽略了中断?

      没错。

      更好的是,重新编码 Runnables 以注意中断...或在关机时设置超时...

      【讨论】:

      • 快速跟进:如果我的线程在executor.awaitTermination() 调用中被阻塞并且我被打断了,究竟会发生什么?我还要打电话给shutdown/shutdownNow吗?
      • 1) awaitTemination() 调用会将InterruptedException 抛出给它的调用者。但请记住,这发生在“等待”线程被中断时,而不是属于执行程序服务的任何线程。 2)如果您希望执行程序关闭,那么可以。
      【解决方案3】:

      shutdownNow 方法的 API 表示:

      除了尽力停止处理之外,没有任何保证 积极执行任务。例如,典型的实现将 通过 Thread.interrupt() 取消,因此任何无法响应的任务 中断可能永远不会终止。

      source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多