簡體   English   中英

ForkJoinTask - join() 與 invoke()

[英]ForkJoinTask - join() vs invoke()

Java 文檔說接下來是join()

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

對於invoke()

開始執行此任務,如有必要等待其完成,並返回其結果,或者如果底層計算這樣做,則拋出(未經檢查的)RuntimeException 或錯誤。

但即使閱讀了文檔,我也無法理解它們之間的區別。 他們都在等待未來返回結果,據我了解他們以不同的方式處理異常?

在 ForkJoinTask API 文檔中,

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

簡單來說,invoke() == fork();join();

fork() 本身是異步的,它將任務分成兩個工作單元並將一個單元傳遞給另一個 ForkJoinTask,可用的 ForkJoinTask 數量由您的 ForkJoinPool 定義。 並且,您將調用 join()/get() 以等待它完成。

同時,對於invoke(),它是同步的,在主線程調用ForkJoinTask,立即阻塞主線程。 如果您需要在 fork() 和 join() 之間執行某些操作,則您不能。

所以我的建議是當您在 fork() 和 join() 之間無事可做並且您只需要純多線程功能時使用 invoke() 。 如果您想在 ForkJoinTasks 之間進行高級連接或在兩者之間執行某些操作,請使用 fork();join();

但請記住,這兩種方法並不意味着您的任務會拆分到另一個線程中。 這取決於您機器中的物理線程數和為您的 ForkJoinPool 初始化的池數。

暫無
暫無

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

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