我大致有這樣的代碼:爲什麼invokeAll()不會返回?
ExecutorService threader = Executors.newFixedThreadPool(queue.size());
List futures = threader.invokeAll(queue);
我這調試的invokeAll和似乎並沒有返回,直到隊列中的所有線程都完成了。任何這種情況發生的原因。
我大致有這樣的代碼:爲什麼invokeAll()不會返回?
ExecutorService threader = Executors.newFixedThreadPool(queue.size());
List futures = threader.invokeAll(queue);
我這調試的invokeAll和似乎並沒有返回,直到隊列中的所有線程都完成了。任何這種情況發生的原因。
報價執行給定的任務,返回保持狀態期貨和結果當所有完整的列表。 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;
}
因爲它的設計那樣:
[...]
Executes the given tasks, returning a list of Futures holding their status and results when all complete.
[...]
當我們調用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
}