API说:"方法 invokeAll
(有多个版本)执行最常见的并行调用形式:分叉一组任务并将它们全部加入。"
所以我的假设是,如果我使用 invokeAll()
,我不再需要使用 fork()
或 join()
方法。我也知道,一般情况下。join()
只有当任务返回一个值:子类的时候才会被调用。RecursiveTask
的子类,如果任务没有返回一个值,则不使用:子类的: RecursiveAction
.
我看到了这个教程,其中有调用 ForkJoinTask.join()
在其被称为。invokeAll()
:
https:/www.baeldung.comjava-fork-join
@Override
protected Integer compute() {
if (arr.length > THRESHOLD) {
return ForkJoinTask.invokeAll(createSubtasks())
.stream()
.mapToInt(ForkJoinTask::join) // join() is called
.sum();
} else {
return processing(arr);
}
}
还有这个帖子,已经使用了 join()
呼叫后 invokeAll()
:
invokeAll(subTask1, subTask2);
return subTask1.join() + subTask2.join();
同时,我看了很多其他的例子,都是关于 invokeAll()
而没有 join()
在该电话之后。
1) 有没有什么规则规定我们什么时候应该或不应该使用 join()
之后 invokeAll()
?
2) invokeAll()
有三种不同的签名,这是不是根据方法的签名来决定是否使用 join()
还是没有?
3)同样的道理,我在API中也看到了这句话。
"方法invoke()在语义上等同于fork();join(),但总是试图在当前线程中开始执行。"
这是不是说 invoke()
等于 fork()
加上 join()
?
当你需要计算结果的时候调用join()。 没有关于何时的规则。 如果你有其他工作要做,你可以这样做,如果你没有其他工作要做,你需要计算的结果,调用join()
这些签名反映了提供任务的不同方式。 其中一个任务来自一个集合,另一个任务来自varargs或数组,第三个任务则是提供两个参数。 否则它们之间没有区别。 使用最方便的一种。
fork(); join()是异步的,由fork的工作是在另一个线程中,当调用join时,当前线程等待工作完成。 invoke()做同样的工作,但在当前线程中。