我大致有这段代码:
ExecutorService threader = Executors.newFixedThreadPool(queue.size());
List futures = threader.invokeAll(queue);
我调试了这个,并且在Queue中的所有线程都完成之前,invokeAll似乎没有返回。发生这种情况的任何原因。
答案 0 :(得分:6)
执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。 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;
}
答案 1 :(得分:5)
因为它是这样设计的:
[...]
Executes the given tasks, returning a list of Futures holding their status and results when all complete.
[...]
的引用
答案 2 :(得分:2)
当我们调用invokeAll()
方法时,它会返回List<Futute<T>>
个对象。
这个Future
对象保存所有线程的值,直到它成功执行。
因此,当我们尝试迭代Future<T>
对象时,它首先在内部检查Future<T>.isDone()
[我们可能会也可能不会在外部检查Future<T>.isDone()
]。如果它返回true,我们可以遍历该对象并可以访问Future<T>
对象的值,否则它将等待为真。
注意:如果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
}