2011-09-07 74 views
1

我對ExecutorService不熟悉,但不確定我的方法。 我可以爲一個已知的任務處理多達100個線程。 我使用下面的一般格式,在那裏創建FutureTasks列表,然後將它們提交給ExecutorService。 ExecutorService返回並將這些掛起的結果添加到另一個列表。 然後我遍歷這個列表,每個掛起的結果調用get()。如何有效處理來自Executor服務的多個結果

我的查詢是:將不會在每個get()上的這個塊,直到所有100個線程完成?有一個更好的方法嗎 ?

我是否正確地認爲get()返回Callable實現的call()方法的結果?我正在使用默認的FutureTask類,並沒有將其子類化。

ExecutorService exec = Executors.newFixedThreadPool(NUM_THREADS); 

List<JobClass> originalList = new ArrayList<JobClass>(); 

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>(); 

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>(); 

for(JobClass sc : originalList) 
    pendingResult.add(submit(sc); 

for(Future<SomeOtherClass> future : futures) 
    resultList.add(future.get(5, TimeUnit.SECONDS)); 

回答

5

好問題,如果我理解正確,你擔心完成任務的結果消耗。是的,線程會阻塞。 Java的答案是使用CompletionService

正如在文檔頁面「將新異步任務的生成與完成任務的結果消耗分離的服務」中所提到的那樣。

+0

如果您需要示例代碼,請讓我知道。 –

+0

感謝doc_180,在你的提示和看看這個[link](http://blog.teamlazerbeez.com/2009/04/29/java-completionservice/)之間,問題解決了。 –

2

如果您只在所有任務完成後繼續,您可以按照您的建議進行操作。任務順序完成無關緊要。但是,如果您需要儘快將任務結果傳遞給其他處理器,或者在執行任務時執行其他操作,則可能需要先使用isDone方法檢查任務是否完成,如果完成則調用get()

相關問題