我已阅读以下代码:
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();
但是,在这一点上,您最好只执行原来的操作,调用
compute
和join
。当您只有两个任务并且需要两个结果时,使用invokeAll
会比较笨拙。