ExecutorService - 等待任務完成的解決方案
當處理大量需要並發執行的計算任務時,它是重要的是要有一個機制來等待所有任務完成。這可確保只有在所有任務完成後才能執行後續操作。
在您的範例中,您嘗試使用 ExecutorService.wait() 來實現此目的,您遇到了 IllegalMonitorStateException。出現此錯誤是因為 wait() 應該在等待物件的固有鎖時使用,這在這種情況下不適用。
最簡單的解決方案是利用 ExecutorService.invokeAll()。此方法採用 Callable 任務的集合,並行執行它們,並傳回 Future 物件的清單。每個 Future 代表特定任務的結果。預設情況下,invokeAll() 將阻塞,直到所有任務完成後才傳回 Future 物件清單。
以下是修改程式碼的方法:
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> tasks = new ArrayList<>(); for (DataTable singleTable : uniquePhrases) { tasks.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> results = es.invokeAll(tasks);
在此更新的程式碼中,ExecutorService .invokeAll() 將等待所有任務完成,讓您可以自信地繼續後續操作。
以上是在繼續執行 ExecutorService 之前如何確保所有任務都已完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!