为什么invokeAll()不会返回?

时间:2009-09-30 15:18:21

标签: java concurrency

我大致有这段代码:

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

我调试了这个,并且在Queue中的所有线程都完成之前,invokeAll似乎没有返回。发生这种情况的任何原因。

3 个答案:

答案 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. 
[...]

http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#invokeAll(java.util.Collection)

的引用

答案 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  
}