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

问题描述 投票:0回答:1

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方法之后调用join?

invokeAll(subTask1, subTask2);

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

同时,我看了很多其他的例子,都是关于 invokeAll() 而没有 join() 在该电话之后。

1) 有没有什么规则规定我们什么时候应该或不应该使用 join() 之后 invokeAll()?

2) invokeAll() 有三种不同的签名,这是不是根据方法的签名来决定是否使用 join() 还是没有?

3)同样的道理,我在API中也看到了这句话。

"方法invoke()在语义上等同于fork();join(),但总是试图在当前线程中开始执行。"

这是不是说 invoke() 等于 fork() 加上 join()?

java fork-join forkjoinpool
1个回答
0
投票
  1. 当你需要计算结果的时候调用join()。 没有关于何时的规则。 如果你有其他工作要做,你可以这样做,如果你没有其他工作要做,你需要计算的结果,调用join()

  2. 这些签名反映了提供任务的不同方式。 其中一个任务来自一个集合,另一个任务来自varargs或数组,第三个任务则是提供两个参数。 否则它们之间没有区别。 使用最方便的一种。

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

© www.soinside.com 2019 - 2024. All rights reserved.