invokeAll 可以在 RecursiveTask 中使用吗?

Can invokeAll be used within a RecursiveTask?

我已阅读以下代码:

invokeAll(a2, a1);

相当于:

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

在 Fork-Join 的 RecursiveAction 中。

但是,由于 RecursiveTask return 是一个值,我们可能有类似的东西:

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

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

现在,我的疑惑是:

invokeAll method can be used for RecursiveTasks. It takes two ForkJoinTask作为参数,因为RecursiveTask扩展了ForkJoinTask,所以一个RecursiveTask可以作为一个ForkJoinTask.

至于获得结果,invokeAll 没有 return 任何东西,因此您不会以这种方式获得信息。您可以做的是在每个 RecursiveTask 上调用 join 方法。因为您知道在 invokeAll return 秒时两个任务都已完成,所以 join 方法将很快 return。

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

然而,在这一点上,你还不如做你最初做的事情,调用 computejoin。当您只有两个任务并且需要它们的两个结果时,使用 invokeAll 有点笨拙。