天天看點

CompletableFuture常用使用方法

項目中需要用到多管道資料查詢,使用CompletableFuture可以很好的滿足需求

什麼是CompletableFuture

可以實作異步任務,以及異步任務之間的協作

使用示例

String idcard = "100";
CompletableFuture<Void> future = CompletableFuture
        //建立一個異步任務,從idcard擷取對應的id
        .supplyAsync(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return Integer.parseInt(idcard);
        })
        //如果出現異常,則傳回id=0
        .exceptionally((e) -> 0)
        //再根據id擷取對應的User
        .thenApply((id) -> {
            return User.builder()
                    .idcard(id.toString())
                    .id(id)
                    .name("name" + id)
                    .build();
        })
        //輸出到System.out
        .thenAccept(System.out::println);           

複制

常用接口

# 建立一個異步任務
CompletableFuture#supplyAsync

# 建立一個特殊的異步任務,當其關聯的異步任務任意一個完成時就傳回
CompletableFuture#anyOf

# 建立一個特殊的異步任務,當其關聯的異步任務都完成時就傳回
CompletableFuture#allOf

# 當發生異常時的處理邏輯:注意,出現異常後,執行邏輯還會繼續,并不會跳出來
CompletableFuture#exceptionally

# 繼續處理結果,并傳回新的結果
CompletableFuture#thenApply

# 與其他的異步任務結合,都執行完畢後再執行新的任務
CompletableFuture#thenCombine

# 繼續異步處理結果,并傳回新任務對應的CompletableFuture。與thenApplyAsync很類似,但是傳回結果更加友好,類似于stream中的flatMap
CompletableFuture#thenCompose

# 處理最後的結果
CompletableFuture#thenAccept           

複制

參考

  • CompletableFuture | thenApply vs thenCompose