首页  >  文章  >  Java  >  如何正确关闭 Java ExecutorService 执行器?

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-24 07:27:30692浏览

How to Properly Shut Down Java ExecutorService Executors?

优雅地关闭 Java ExecutorService

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

了解 ExecutorService 关闭

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

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

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

建议的关闭过程

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

<code class="java">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();
    }
}</code>

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

<code class="java">if (!pool.awaitTermination(60, TimeUnit.SECONDS))</code>

替换为

<code class="java">while (!pool.awaitTermination(60, TimeUnit.SECONDS))</code>

继续等待任务完成。

关机摘要方法

  • shutdown():停止接受新任务,但允许完成现有任务。
  • shutdownNow():停止所有正在执行和等待的任务,返回未处理的任务。
  • awaitTermination(long timeout, TimeUnit unit):阻塞,直到所有任务完成、超时或当前线程被中断。

以上是如何正确关闭 Java ExecutorService 执行器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn