等待ExecutorService 任務完成
問題:
問題:如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都如何高效地等待所有的任務都提交給一個ExecutorService來完成?具體用例涉及在多個核心上執行的計算任務。
背景:給定的程式碼片段利用 ExecutorService.wait(),但失敗並出現 IllegalMonitorStateException。儘管任務執行成功,但等待操作似乎遇到了問題。
答案:
ExecutorService.invokeAll()建議的解決方案是使用ExecutorService.invoke(Allor)。它提供了一種等待所有任務完成的簡單方法。這是修改後的程式碼範例:
invokeAll() 行為invokeAll() 會阻塞,直到所有任務完成。產生的答案集合包含表示每個任務的狀態和潛在回傳值的 Future。預設情況下,由 Executors.callable() 包裝,這些 Future 將傳回 null。但是,您可以修改ComputeDTask以實作Callable
使用 invokeAll() 簡化了程式碼並避免了與 wait() 相關的潛在競爭條件。它還允許 ExecutorService 在多個週期中重複使用。
相關問題:以上是如何有效率地等待所有ExecutorService任務完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!