”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何正确关闭 Java ExecutorService 执行器?

如何正确关闭 Java ExecutorService 执行器?

发布于2024-11-10
浏览:843

How to Properly Shut Down Java ExecutorService Executors?

优雅地关闭 Java ExecutorService

执行器是在 Java 应用程序中同时管理和执行任务的便捷方法。但是,不正确的关闭可能会导致意外行为或性能问题。本指南详细说明了如何正确关闭 ExecutorService,确保所有任务都终止或取消。

了解 ExecutorService 关闭

ExecutorService 提供两种主要关闭方法:

  • shutdown():阻止新任务提交,同时允许现有任务完成。
  • shutdownNow():尝试停止所有正在执行和等待的任务,返回未处理任务的列表。

需要注意的是,shutdown 并不能保证终止所有任务。无法响应中断或具有长时间运行操作的任务可能会保持活动状态。

推荐的关闭过程

Oracle 文档建议使用以下方法来正常关闭:

void shutdownAndAwaitTermination(ExecutorService pool) {
    pool.shutdown();
    try {
        // Wait for existing tasks to terminate
        if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
            pool.shutdownNow();
            // Wait for tasks to respond to cancellation
            if (!pool.awaitTermination(60, TimeUnit.SECONDS))
                System.err.println("Pool did not terminate");
        }
    } catch (InterruptedException ie) {
        pool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

此方法可确保允许完成现有任务,同时防止新的提交。如果关闭过程花费的时间比预期长,您可以将

if (!pool.awaitTermination(60, TimeUnit.SECONDS))

替换为

while (!pool.awaitTermination(60, TimeUnit.SECONDS))

继续等待任务完成。

关机方法总结

  • shutdown():停止接受新任务,但允许现有任务完成。
  • shutdownNow():停止所有正在执行和等待的任务,返回未处理的任务.
  • awaitTermination(long timeout, TimeUnit unit):阻塞,直到所有任务完成、超时或当前线程被中断。
版本声明 本文转载于:1729725790如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3