首頁  >  文章  >  Java  >  如何正確關閉 Java ExecutorService 執行器?

如何正確關閉 Java ExecutorService 執行器?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-24 07:27:30625瀏覽

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