[英]Fork-Join related: join() vs get() vs invoke()
我是否需要將join()
與fork()
使用,或者也可以使用join()
, get()
, invoke()
。 我檢查了API ,除了get()
拋出InterruptedException
和ExecutionException
我看不出任何區別……而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()
相同,但要點是,您確實在調用fork
和join
之間的當前Thread
上進行工作。
它是用您引用的API文檔編寫的:
等待完成和提取任務結果的主要方法是join(),但有幾種變體:Future.get()方法支持可中斷和/或定時等待完成,並使用Future約定報告結果。 方法invoke()在語義上等效於fork(); join(),但始終嘗試在當前線程中開始執行。 這些方法的“安靜”形式不會提取結果或報告異常。 當執行一組任務時,這些功能可能很有用,並且您需要將結果或異常的處理延遲到所有任務完成為止。 方法invokeAll(有多個版本可用)執行並行調用的最常見形式:分派一組任務並將它們全部加入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.