gpt4 book ai didi

java - 我们什么时候应该在 ForkJoinTask.invokeAll() 之后调用 join()

转载 作者:行者123 更新时间:2023-12-01 16:39:08 27 4
gpt4 key购买 nike

API 说:“方法invokeAll(有多个版本)执行最常见的并行调用形式: fork 一组任务并将它们全部连接起来。”

所以我的假设是,如果我使用 invokeAll(),我就不再需要使用 fork()join() 方法。我还知道,一般来说,仅当任务返回一个值时才会调用 join() : RecursiveTask 的子类,如果任务不返回值,则不会使用:子类:RecursiveAction

我发现本教程在调用 invokeAll() 之后调用了 ForkJoinTask.join():

https://www.baeldung.com/java-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);
}
}

还有这篇文章,在调用 invokeAll() 后使用了 join():

Why should we call join after invokeAll method?

invokeAll(subTask1, subTask2);

return subTask1.join() + subTask2.join();

同时,我查看了 invokeAll() 的许多其他示例,并且在该调用之后没有 join()

1) 是否有任何规则规定我们什么时候应该或不应该在 invokeAll() 之后使用 join()

2) invokeAll()有三种不同的签名,这是否取决于方法的签名来决定是否使用join()

3)同样,我还在 API 中读到了这一点:

“方法 invoke() 在语义上等同于 fork();join(),但始终尝试在当前线程中开始执行。”

它是说invoke()等于fork()加上join()吗?

最佳答案

  1. 当需要计算结果时调用 join()。没有关于何时的规则。如果您有其他工作要做,您可以这样做,如果您没有其他工作要做并且需要计算结果,请调用 join()

  2. 签名反射(reflect)了提供任务的不同方式。其中一个来自集合,另一个来自可变参数或数组,第三个则提供两个作为参数。否则它们之间没有区别。使用最方便的那个。

  3. fork(); join() 是异步的,fork 的工作在另一个线程中,当前线程在调用 join 时等待工作完成。 invoke() 执行相同的工作,但在当前线程中。

关于java - 我们什么时候应该在 ForkJoinTask.invokeAll() 之后调用 join(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61900477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com