簡體   English   中英

跟蹤ExecutorService中的已完成任務

[英]Tracking Completed Tasks in ExecutorService

我正在用Java編寫一個應用程序,它使用ExecutorService來運行多個線程。

我希望將多個任務(一次數千個)作為Callables提交給Executor,並在完成后檢索其結果。 我接近這個的方式是每次調用submit()函數時,我得到一個存儲在ArrayList中的Future。 稍后我將List傳遞給一個不斷迭代它的線程,調用future.get()函數並超時以查看任務是否完成。 這是正確的方法還是效率太低?

編輯---更多信息---另一個問題是每個Callable需要不同的處理時間。 因此,如果我只是從List中取出第一個元素並在其上調用get(),它將阻塞,而其他元素的結果可能變得可用而程序將無法知道。 這就是為什么我需要繼續迭代超時。

提前致謝

這是正確的方法還是效率太低?

這本身並不正確。 你不必要地迭代ArrayList檢查任務完成。

這很簡單:只需使用: CompletionService 您可以輕松地將現有執行程序包裝到其中。 來自JavaDocs:

生產者提交執行任務。 消費者完成任務並按照他們完成的順序處理結果。

實質上, CompletionService提供了一種簡單地通過調用take()來獲取結果的方法。 它是一個阻塞函數,調用者將阻塞,直到結果可用。


請注意,對Future.get的調用將阻止,直到答案可用。 所以你不需要另一個線程迭代數組列表。

請參閱https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM