簡體   English   中英

與叉加入有關:join()vs get()vs invoke()

[英]Fork-Join related: join() vs get() vs invoke()

我是否需要將join()fork()使用,或者也可以使用join()get()invoke() 我檢查了API ,除了get()拋出InterruptedExceptionExecutionException我看不出任何區別……而invoke()似乎完全一樣。

但是我一直看到與join()而不是其他兩種方法相關的fork() ……它們不提供並行性嗎? 具有完全相同的invoke()join()的目的是什么? 我可以理解實現將來會得到的get(),但是invoke()和join()呢? 提前致謝。

編輯 :我引用的API不好,因為已經收到的答案指出它對它說了些什么。 但是,它們的含義是:

方法invoke()在語義上等效於fork(); join()但總是嘗試在當前線程中開始執行

提前致謝。

為什么不閱讀鏈接到的文檔?

調用

開始執行此任務,在必要時等待其完成,然后返回其結果,或者如果基礎計算執行了此操作,則拋出(未經檢查的)RuntimeException或Error。

對我來說似乎很清楚, 如果有必要等待它的完成就很明確地說這種方法不是異步的。

得到

必要時等待計算完成,然后檢索其結果。

此方法是從Future繼承的,此方法類似於join 從javadoc join

完成后返回計算結果。 此方法與get()的不同之處在於,異常完成會導致RuntimeException或Error而不是ExecutionException,並且調用線程的中斷不會導致該方法通過拋出InterruptedException突然返回。

因此,要使用Fork / Join框架,您需要調用異步的fork 然后在本地執行任務的另一部分。 然后調用join

fork聯接框架的基本前提是,它可以在多線程的分治算法中使用。

想法是將您的任務分成兩個離散的單元,然后通過fork將一個任務傳遞給另一個ForkJoinTask這與當前Thread同時運行。 然后,您可以處理當前Thread中的另一個單元。 完成后,您可以在第一個任務上調用join ,以確保從中獲得結果。

調用invoke 等待調用的任務完成 因此,您的方法現在不是異步的。 您只需按順序運行所有零件,這在一定程度上擊敗了fork / join的觀點。

因此,如果要調用x.fork().join() ,它將與x.invoke()相同,但要點是,您確實調用forkjoin 之間的當前Thread上進行工作。

它是用您引用的API文檔編寫的:

等待完成和提取任務結果的主要方法是join(),但有幾種變體:Future.get()方法支持可中斷和/或定時等待完成,並使用Future約定報告結果。 方法invoke()在語義上等效於fork(); join(),但始終嘗試在當前線程中開始執行。 這些方法的“安靜”形式不會提取結果或報告異常。 當執行一組任務時,這些功能可能很有用,並且您需要將結果或異常的處理延遲到所有任務完成為止。 方法invokeAll(有多個版本可用)執行並行調用的最常見形式:分派一組任務並將它們全部加入。

暫無
暫無

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

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