CompletableFuture非同步優化程式碼

2023-10-19 21:02:48

CompletableFuture非同步編排優化程式碼

我們在專案開發中,有可能遇到一個介面需要呼叫N個服務的介面。比如使用者請求獲取訂單資訊,需要呼叫使用者資訊、商品資訊、物流資訊等介面,最後再彙總資料統一返回。如果使用序列的方法按照順序挨個呼叫介面,這樣介面的響應的速度就很慢。如果並行呼叫介面,同時呼叫就會節省很多時間。下面就介紹一個好用的非同步編排工具CompletableFuture

簡介

CompletableFuture 是 Java 8 中新增的一個非同步程式設計工具類,它是基於 Future 和 CompletionStage 介面構建的,可以與 Java 8 中的 Stream API 配合使用,也能夠與 Java 9 中的 Reactive Stream API 進行互動。
主要用於非同步執行任務並返回結果,實現非同步計算和操作組合。它提供了一種靈活、可組合的方式來實現非同步計算,同時也提供了例外處理、取消、超時等特性。在CompletableFuture中,我們可以通過回撥函數來處理任務的結果,也可以使用其它方法來組合多個CompletableFuture物件,以構建更復雜的非同步操作流水線。

建立非同步任務

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier){..}  
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor){..}  
public static CompletableFuture<Void> runAsync(Runnable runnable){..}  
public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor){..} 

supplyAsync

supplyAsync是建立有返回值的非同步任務。它有兩個方法,一個是使用預設執行緒池(ForkJoinPool.commonPool())的方法,一個是帶有自定義執行緒池的過載方法

// 有返回值,預設執行緒池
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
 
// 帶返回值的非同步,可以自定義執行緒池
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
 

程式碼範例