參考面試回答:
個人理解
CompletableFuture
是 Java 8 引入的一個類、它可以讓我們在多線程環境中更加容易地處理異步任務。CompletableFuture
的底層原理是基于一個名為 FutureTask 的機制、結合了 監聽器模式 和 等待-通知機制 來處理異步計算。
1.首先就是CompletableFuture
實現了 Future
接口:
這意味著 可以像 Future
一樣、用于獲取異步計算的結果、檢查計算狀態等。以及內部使用了 FutureTask
: FutureTask
是 Future
接口的一個實現類、它可以包裝一個 Callable
對象、并在后臺線程中執行 Callable
的 call()
方法。 FutureTask
負責管理任務的狀態、存儲計算結果或異常,并提供同步等待的機制。
2.然后核心的兩個字段:
result
字段:
-
它有多個狀態、通常是
未完成
、已完成正常
、已完成異常
、已取消
等。它通過一個volatile
變量來保持任務的執行狀態。用于存儲異步計算的結果。如果計算過程中發生異常result
會存儲異常對象。 -
任務完成后、通過調用
complete()
方法來更新狀態、并通知等待的線程。
然后就是
stack
字段:
-
這是一個
Completion
類型的鏈表、也稱為依賴鏈。 每個Completion
對象代表一個待觸發的依賴任務、例如thenApply
、thenAccept
等方法創建的任務。stack
鏈表將這些任務串聯起來,形成任務編排的流水線。
3.然后介紹一下監聽器模式:
-
CompletableFuture
支持鏈式調用(例如:thenApply
、thenAccept
等)、這些方法為某個任務注冊了回調函數(監聽器)。回調函數會在任務完成后執行。內部通過Listener
機制實現、使用synchronized
或CAS
來保證線程安全。 -
??以及這些回調通常會通過
Executor
執行。CompletableFuture
支持使用默認的線程池(ForkJoinPool
)來執行這些任務、也可以自定義線程池。
4.與 Future
的區別:
CompletableFuture
相比于傳統的 Future
,提供了更強大的功能,例如鏈式調用、異常處理、組合操作等,使得異步編程更加靈活和方便。
我個人覺得這個的內容太多 我先放一個面試回答 后續補充內容?