【问题标题】:ExecutorService shutdownExecutorService 关闭
【发布时间】:2014-01-26 10:05:03
【问题描述】:

我对 ExecutorService#shutdown 方法的 javadoc 感到困惑。这些不是矛盾的说法吗?

启动有序关闭,其中先前提交的任务被 执行,但不会接受新任务。此方法无需等待 为之前提交的任务完成执行。利用 awaitTermination 这样做。

如果它可以有序地关闭之前提交的任务,那它怎么不等待它们完成执行呢?

【问题讨论】:

  • 注释表示之前的任务不会被丢弃。并不是说他们会立即被处决。为此使用awaitTermination()
  • 例程几乎立即返回,而不是等待所有任务完成。

标签: java concurrency java.util.concurrent


【解决方案1】:

这意味着该方法在您调用它的线程中立即返回,但尚未执行的任务可能仍在其他线程中运行。

如果你想让你的程序等到之前提交的任务完成,你必须在调用shutdown之后再调用awaitTermination

【讨论】:

  • 没错,它简单地将两个关注点分开。在某些情况下,您可能想不等待就关闭。
  • 我可以想象调用 awaitTermination() 就像在 ExecutorService 实例上调用 .join() 一样吗?如果我不调用 awaitTermination(),在这种情况下,主线程(或调用者线程,准确地说)与 ExecutorService 线程同时继续。如果我调用 awaitTermination(),主线程将停止执行,直到 ExecutorService 线程完成。请确认我的理解是否正确?
【解决方案2】:

这意味着任务将运行到完成,但是这个方法会立即返回,而不是等待它发生。

因此,要在不终止任何任务的情况下彻底关闭执行程序,您可以:

executor.shutdown();
executor.awaitTermination(long timeout, TimeUnit unit);

或者,如果您只想尽快停止执行程序,请使用shutdownNow()

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多