/*分叉指定集合 tasks 中的所有任务*/
public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T>tasks{
/*类型验证*/
if (!(tasks instanceof RandomAccess) || !(tasks instanceof List<?>)) {
/*包含此集合中所有元素的数组*/
invokeAll(tasks.toArray(new ForkJoinTask<?>[tasks.size()]));
return tasks;
}
/*集合类型强转*/
@SuppressWarnings("unchecked")
List<? extends ForkJoinTask<?>> ts =(List<? extends ForkJoinTask<?>>) tasks;
/*定义了一个可供抛出的异常*/
Throwable ex = null;
/*开始从 tasks 中拿具体的任务*/
int last = ts.size() - 1;
/*遍历 。。。*/
for (int i = last; i >= 0; --i) {
/*把集合中的任务强制转换为 ForkJoinTask*/
ForkJoinTask<?> t = ts.get(i);
if (t == null) {
/*任务为空需要抛出异常*/
if (ex == null) ex = new NullPointerException();
}
/*把每一个分叉出来的子任务安排在线程池中异步执行*/
else if (i != 0) t.fork();
/*t.doInvoke() 独自调用一次,
因为是绕过了前面 fork 那一步的执行,
所以这一步的主要目的是手动让其报错*/
else if (t.doInvoke() < NORMAL && ex == null) ex = t.getException();
}
for (int i = 1; i <= last; ++i) {
ForkJoinTask<?> t = ts.get(i);
if (t != null) {
if (ex != null)
/*因为中断不是用来控制取消的,所以把对它的线程中断设置为 false*/
t.cancel(false);
/*绕过了上一步正常流程,这一步主要目的也是手动优雅的让他报错*/
else if (t.doJoin() < NORMAL)
ex = t.getException();
}
}
/*如果不为空,说明存在异常*/
if (ex != null)
/*抛出*/
rethrow(ex);
/*返回任务集合*/
return tasks;
}