2009-09-30 108 views
2

我大致有這樣的代碼:爲什麼invokeAll()不會返回?

ExecutorService threader = Executors.newFixedThreadPool(queue.size()); 
List futures = threader.invokeAll(queue); 

我這調試的invokeAll和似乎並沒有返回,直到隊列中的所有線程都完成了。任何這種情況發生的原因。

回答

6

報價執行給定的任務,返回保持狀態期貨和結果當所有完整的列表。 the API

你必須submit()逐一時間,而不是,是這樣的:

public static <T> List<Future<T>> submitAll (ExecutorService executor, Collection<? extends Callable<T> > tasks) { 
    List<Future<T>> result = new ArrayList<Future<T>>(tasks.size()); 

    for (Callable<T> task : tasks) 
     result.add (executor.submit (task)); 

    return result; 
} 
2

當我們調用invokeAll()方法返回List<Futute<T>>對象。 此Future對象保存所有線程的值,直到它成功執行。 所以當我們試圖通過Future<T>對象迭代時,它首先在內部檢查Future<T>.isDone() [我們可能會或可能不會檢查外部] Future<T>.isDone()。如果它返回true,我們可以迭代對象並可以訪問對象的值,否則它會等待直到真實。

注意:如果Future<T>得到一個錯誤的對象,它將不允許您迭代該對象。

ExecutorService threader = Executors.newFixedThreadPool(queue.size()); 
List<Future<T>> listFuture = threader.invokeAll(queue); 
for(Future<T> future: listFuture) { 
    // Here you have the full access to this future object 
} 
相關問題