可以在RecursiveTask中使用invokeAll吗?

时间:2018-10-19 10:54:29

标签: java concurrency java.util.concurrent fork-join

我已阅读以下代码:

invokeAll(a2, a1);

等效于:

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

在Fork-Join中的递归操作中。

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

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

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

现在,我的疑问是:

  • invokeAllAll可以用于RecursiveTasks吗?

  • 如果是这样,如何合并invokeAll调用的结果以返回 最终结果?

1 个答案:

答案 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();

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