」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何正確關閉 Java ExecutorService 執行器?

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

發佈於2024-11-10
瀏覽:968

How to Properly Shut Down Java ExecutorService Executors?

優雅地關閉 Java ExecutorService

執行器是在 Java 應用程式中同時管理和執行任務的便捷方法。但是,不正確的關閉可能會導致意外行為或效能問題。本指南詳細說明如何正確關閉 ExecutorService,確保所有任務都終止或取消。

了解ExecutorService 關閉

ExecutorService 提供兩種主要關閉方法:

  • shdowndown():防止新新新新新0任務被執行提交,同時允許現有任務完成。
  • shutdownNow():嘗試停止所有正在執行和等待的任務,返回未處理任務的清單。

它是需要注意的是,關閉並不能保證終止所有任務。無法回應中斷或具有長時間運行操作的任務可能會保持活動狀態。

建議的關閉過程

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()
  • shutdownNow():停止所有正在執行和等待的任務,返回未處理的任務tasks.
awaitTermination(long timeout, TimeUnit unit)

:阻塞,直到所有任務完成、逾時或目前執行緒中斷。 How to Properly Shut Down Java ExecutorService Executors?

版本聲明 本文轉載於:1729725790如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3