Java 在executorService的invokeAll方法中,阻塞意味着什么?
据说,当我们想等待所有任务完成时,使用invokeAll,而提交或执行则不等待 我们所说的完成任务是什么意思。这是否意味着生成所有其他线程的父线程会卡在该点上,直到所有线程返回?请参见Java 在executorService的invokeAll方法中,阻塞意味着什么?,java,multithreading,concurrency,executorservice,Java,Multithreading,Concurrency,Executorservice,据说,当我们想等待所有任务完成时,使用invokeAll,而提交或执行则不等待 我们所说的完成任务是什么意思。这是否意味着生成所有其他线程的父线程会卡在该点上,直到所有线程返回?请参见 List invokeAll(CollectionIt表示任务完成后方法返回(正常或异常)。集合中的每个可调用的都是一个任务。用于执行任务的线程由ExecutorService决定。典型的实现是一个线程池,它将重用现有线程。提交任务时有多少可用线程或是否创建了线程取决于线程池的配置方式。Lookin代码是理解Ja
List invokeAll(CollectionIt表示任务完成后方法返回(正常或异常)。集合中的每个可调用的
都是一个任务。用于执行任务的线程由ExecutorService
决定。典型的实现是一个线程池,它将重用现有线程。提交任务时有多少可用线程或是否创建了线程取决于线程池的配置方式。Lookin代码是理解JavaSE功能的糟糕方法从一个Java版本到下一个Java版本,只要他们遵守方法的约定。Javadoc for invokeall并没有明确地说这是阻塞调用,可能这就是提出问题的原因。添加代码是为了在解释时提供更清晰的说明。我理解代码可以更改,这就是我随代码一起给出jdk版本的原因。javadoc对此非常清楚:“执行给定的任务,在所有任务完成后返回一个包含其状态和结果的未来列表。Future.isDone()
对于返回的列表中的每个元素都是true
。”这两个句子中的每一个都暗示了阻塞行为。在我看来,英语句子本可以用更好的方式书写,像我这样的普通人在第一次阅读时无法理解这一点。阻塞关键字应该在那里,或者我们可以写类似的东西“执行给定的任务,仅当所有任务完成时才返回一个未来列表”。场外未来有一个isDone来检查状态,不确定为什么我们需要在这里添加“锁定其状态”
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException
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();
} 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);
}
}