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

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

Barbara Streisand
Barbara Streisand原創
2024-12-03 12:28:10199瀏覽

How to Efficiently Wait for All ExecutorService Tasks to Finish?

等待ExecutorService 任務完成

問題:

問題:

如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都提交給一個ExecutorService來完成?具體用例涉及在多個核心上執行的計算任務。

背景:

給定的程式碼片段利用 ExecutorService.wait(),但失敗並出現 IllegalMonitorStateException。儘管任務執行成功,但等待操作似乎遇到了問題。

答案:

ExecutorService.invokeAll()

建議的解決方案是使用ExecutorService.invoke(Allor)。它提供了一種等待所有任務完成的簡單方法。這是修改後的程式碼範例:

invokeAll() 行為

invokeAll() 會阻塞,直到所有任務完成。產生的答案集合包含表示每個任務的狀態和潛在回傳值的 Future。預設情況下,由 Executors.callable() 包裝,這些 Future 將傳回 null。但是,您可以修改ComputeDTask以實作Callable;提供有意義的回傳值。

好處:

使用 invokeAll() 簡化了程式碼並避免了與 wait() 相關的潛在競爭條件。它還允許 ExecutorService 在多個週期中重複使用。

相關問題:
  • 要進一步說明,請考慮 Stack Overflow 上的以下相關問題:
  • [如何等待所有執行緒finish](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [從java線程回傳值](https://stackoverflow .com/questions/11937661/return-values-from-java-threads)
[invokeAll() 不願意接受a Collection>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)[我需要嗎同步? ](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn