我已阅读以下代码:

invokeAll(a2, a1);


等效于:

a2.compute();
a1.join();


在Fork-Join中的RecursiveAction中。

但是,由于RecursiveTask返回一个值,所以我们可能会有类似以下内容:

Integer result1 = t2.compute();
Integer result2 = t1.join();


然后我们应该合并result1和result2以产生最终结果。

现在,我的疑问是:


可以将invokedAll用于RecursiveTasks吗?
如果是这样,如何合并invokeAll调用的结果以返回
最后结果?

最佳答案

invokeAll方法可用于RecursiveTask。它以两个ForkJoinTask作为参数,并且由于RecursiveTask扩展了ForkJoinTask,因此RecursiveTask可以用作ForkJoinTask

至于获取结果,invokeAll不返回任何内容,因此您不会以这种方式获取信息。您可以做的是在每个join上调用RecursiveTask方法。因为您知道当invokeAll返回时两个任务都已完成,所以join方法将很快返回。

invokeAll(t1, t2);
Integer result1 = t1.join();
Integer result2 = t2.join();


但是,在这一点上,您最好只执行原来的操作,调用computejoin。当您只有两个任务并且需要两个结果时,使用invokeAll会比较笨拙。

09-11 20:28