首頁 > Java > java教程 > 如何有效率地等待 ExecutorService 中的所有任務完成?

如何有效率地等待 ExecutorService 中的所有任務完成?

Mary-Kate Olsen
發布: 2024-12-10 16:01:11
原創
892 人瀏覽過

How Can I Efficiently Wait for All Tasks to Complete in an ExecutorService?

ExecutorService:等待任務完成

ExecutorService 是一個高效任務執行的便捷工具,但暫停直到所有任務完成可能會很棘手。讓我們深入探討一個常見問題及其實際解決方案。

wait() 中的錯誤

引用的程式碼片段使用固定執行緒池 ExecutorService,體驗嘗試使用 es.wait() 時出現 IllegalMonitorStateException。發生這種情況是因為 wait() 旨在與特定線程同步習慣用法一起使用,而不是與 ExecutorService 一起使用。

最簡單的解決方案:invokeAll()

ExecutorService 為此目的:invokeAll()。此方法會取得可呼叫任務的集合,並行執行它們,並阻塞直到所有任務完成。使用方法如下:

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<>(uniquePhrases.size());

for (DataTable singleTable: uniquePhrases) { 
    todo.add(Executors.callable(new ComputeDTask(singleTable))); 
}

List<Future<Object>> answers = es.invokeAll(todo);
登入後複製

invokeAll() 傳回一個 Future 物件列表,每個物件代表一個單獨的任務。一旦所有任務完成,訪問任何 Future 的 isDone() 將傳回 true。

invokeAll() 的優點

  • 阻塞,直到所有任務完成。
  • 避免手動關閉和同步。
  • 允許重複使用ExecutorService用於多個任務循環。

其他方法

  • 也可以使用shutdown()和awaitTermination(),但需要手動關閉處理.
  • submit (Callable)可用於單一任務提交,但需要手動追蹤任務

請記住,invokeAll() 要求您的任務實作 Callable。如果 ComputeDTask 是 Runnable,請將其包裝為程式碼片段中所示或利用 Executors.callable()。

以上是如何有效率地等待 ExecutorService 中的所有任務完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板