首页 > 解决方案 > 可以在 RecursiveTask 中使用 invokeAll 吗?

问题描述

我已阅读以下代码:

invokeAll(a2, a1);

相当于:

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

在 Fork-Join 的 RecursiveAction 中。

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

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

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

现在,我的疑问是:

标签: javaconcurrencyjava.util.concurrentfork-join

解决方案


invokeAll方法可用于RecursiveTasks。它需要两个ForkJoinTasks 作为参数,并且因为RecursiveTaskextends ForkJoinTask,所以 aRecursiveTask可以用作 a ForkJoinTask

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

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

但是,此时,您不妨只做您最初正在做的事情,调用computeand join。当您只有两个任务并且需要它们的两个结果时,使用invokeAll有点笨拙。


推荐阅读