CompletableFuture非同步編排優化代碼 我們在項目開發中,有可能遇到一個介面需要調用N個服務的介面。比如用戶請求獲取訂單信息,需要調用用戶信息、商品信息、物流信息等介面,最後再彙總數據統一返回。如果使用串列的方法按照順序挨個調用介面,這樣介面的響應的速度就很慢。如果並行調用介面,同時調用 ...
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)
代碼示例