2011-06-16 47 views
1

可能重複:
ExecutorService, how to wait for all tasks to finish
Java ExecutorService: awaitTermination of all recursively created tasks塊,直到ExecutorService的完成

有沒有辦法來阻止當前線程,直到一個ExecutorService已經完成了所有任務?

executor.execute(task1); 
executor.execute(task2); 
executor.execute(task3); 
executor.execute(task4); 
executor.execute(task5); 
// ...now I want to block until all tasks have finished executing... 
System.out.println("done!") 
+0

使用'invokeAll',然後調用'的'返回對象Future' ... GET'它類似於'的Thread.join() '。 – mre 2011-06-16 15:55:03

回答

3

您可以使用ThreadPoolExecutor與您要執行設置爲System.getRuntime().availableProcessors()的Java 6池大小或Runtime.getRuntime().availableProcessors()的Java 8.execute()它的所有任務,然後調用tpe.shutdown(),然後等待在while(!tpe.terminated()) { /* waiting for all tasks to complete */}其中所有提交的任務都可以完成。 其中tpe是對您的ThreadPoolExecutor實例的參考。

或者如果更合適的話使用ExecutorCompletionService A CompletionService,它使用提供的Executor來執行任務。本課程安排提交的任務在完成後放置在可以使用take的可訪問的隊列中。該類輕量級足以適用於處理任務組時的瞬時使用。

+2

'while(!tpe.terminated()){}'正忙於等待。 – subsub 2013-09-27 14:58:45

7

給所有的任務,把它們放入一個列表可調用然後的invokeAll他們

ExecutorService e = ... 

e.invokeAll(callables); 

每的javadoc

執行給定的任務,返回期貨的 列表保持自己的狀態 和結果全部完成。 Future.isDone()對返回列表的每個 元素都成立。注意 完成的任務可能有 正常終止或由 拋出異常。 此方法的結果未定義,如果在進行此 操作時修改了給定的 集合。

因此該線程將等到所有任務的避風港完成