簡體   English   中英

我們什么時候應該在 ForkJoinTask.invokeAll() 之后調用 join()

[英]When should we call join() after ForkJoinTask.invokeAll()

API 說:“方法invokeAll (有多個版本)執行最常見的並行調用形式:分叉一組任務並將它們全部連接起來。”

所以我的假設是如果我使用invokeAll() ,我不再需要使用fork()join()方法。 我也知道,一般來說,僅當任務返回值時才調用join()RecursiveAction的子類,如果任務未返回值: RecursiveTask的子類,則不使用。

我遇到了本教程,它在調用后調用了ForkJoinTask.join()invokeAll()

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() ) :

為什么我們要在 invokeAll 方法之后調用 join?

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. 簽名反映了提供任務的不同方式。 一個來自集合,另一個來自可變參數或數組,第三個提供兩個作為 arguments。 否則它們之間沒有區別。 使用最方便的一種。

  3. 叉子(); join() 是異步的,fork 的工作在另一個線程中,當前線程在調用 join 時等待工作完成。 invoke() 做同樣的工作,但在當前線程中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM