执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。 Future.isDone()对于返回列表的每个元素为true。
请注意,已完成的任务可能已正常终止,也可能引发异常。如果在进行此操作时修改了给定的集合,则此方法的结果不确定。
期货只能在执行完成时完成,因此,只有在任务执行完毕后才能返回此方法。
它可以引发InterruptedException的情况也表示阻塞动作。
查看
invokeAllin
java.util.concurrent.AbstractExecutorService(注释内联)的实现:
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); boolean done = false; try { for (Callable<T> t : tasks) { RunnableFuture<T> f = newTaskFor(t); futures.add(f); execute(f); } for (int i = 0, size = futures.size(); i < size; i++) { Future<T> f = futures.get(i); if (!f.isDone()) { try { f.get(); // <== *** BLOCKS HERE *** } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; return futures; } finally { if (!done) for (int i = 0, size = futures.size(); i < size; i++) futures.get(i).cancel(true); }}实际上,在这些情况下,当Javadoc-Specese似乎难以破译时,通常应该看一下参考实现。(请注意,一些实现细节不是规范的一部分。)



