【问题标题】:Can invokeAll be used within a RecursiveTask?可以在 RecursiveTask 中使用 invokeAll 吗?
【发布时间】:2026-02-02 05:00:01
【问题描述】:

我已阅读以下代码:

invokeAll(a2, a1);

相当于:

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

在 Fork-Join 中的 RecursiveAction 中。

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

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

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

现在,我的疑问是:

  • invokedAll 可以用于 RecursiveTasks 吗?

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

【问题讨论】:

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


    【解决方案1】:

    invokeAll 方法可用于RecursiveTasks。它需要两个ForkJoinTasks 作为参数,并且因为RecursiveTask 扩展了ForkJoinTask,所以RecursiveTask 可以用作ForkJoinTask

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

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

    但是,此时,您也可以按照原来的方式进行操作,调用computejoin。当您只有两个任务并且需要它们的两个结果时,使用 invokeAll 有点笨拙。

    【讨论】: