[英]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()
嗎?
當您需要計算結果時調用 join()。 什么時候沒有規定。 如果您有其他工作要做,您可以這樣做,如果您沒有其他工作要做並且需要計算結果,請調用 join()
簽名反映了提供任務的不同方式。 一個來自集合,另一個來自可變參數或數組,第三個提供兩個作為 arguments。 否則它們之間沒有區別。 使用最方便的一種。
叉子(); join() 是異步的,fork 的工作在另一個線程中,當前線程在調用 join 時等待工作完成。 invoke() 做同樣的工作,但在當前線程中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.