我已阅读以下代码:
invokeAll(a2, a1);
等效于:
a2.compute();
a1.join();
在Fork-Join中的递归操作中。
但是,由于RecursiveTask返回一个值,所以我们可能会有类似的内容:
Integer result1 = t2.compute();
Integer result2 = t1.join();
然后我们应该将result1和result2合并以产生最终结果。
现在,我的疑问是:
invokeAllAll可以用于RecursiveTasks吗?
如果是这样,如何合并invokeAll调用的结果以返回 最终结果?
答案 0 :(得分:1)
invokeAll
方法可用于RecursiveTask
s。它需要两个ForkJoinTask
作为参数,并且由于RecursiveTask
扩展了ForkJoinTask
,因此RecursiveTask
可以用作ForkJoinTask
。
关于获取结果,invokeAll
不返回任何内容,因此您不会以这种方式获取信息。您可以做的是在每个RecursiveTask
上调用join
方法。因为您知道invokeAll
返回时两个任务都已完成,所以join
方法将很快返回。
invokeAll(t1, t2);
Integer result1 = t1.join();
Integer result2 = t2.join();
但是,在这一点上,您最好也执行原来的操作,调用compute
和join
。当您只有两个任务并且需要两个任务的结果时,使用invokeAll
会比较笨拙。