五、異步任務編排CompletableFuture


一、簡介

並發編程中我們經常創建異步線程來執行任務。但是,當異步任務之間存在依賴關系時,使得我們開發過程變得更加復雜。比如:

1、線程2依賴於線程1的執行結果

2、線程3依賴於線程1和線程2執行結果的合並

要實現以上兩個異步線程的依賴,我們可能會采用等待/通知、消費隊列或者一些比較麻煩的邏輯來控制異步任務的的關系。這期間,你可能不得不考慮中間結果,以及並發臨界點等問題。

總而言之,對於復雜的異步任務的控制不是一個容易的事情。

CompletableFuture 

completableFuture是JDK於1.8+提供的一個實現類,它主要用於異步任務的編排,很好地幫我們解決異步任務控制邏輯。

它實現了Future接口和CompletableStage接口,所以你可以像使用Future一樣簡單地使用CompletableFuture。

JDK文檔:https://blog.fondme.cn/apidoc/jdk-1.8-google/java/util/concurrent/CompletableFuture.html

二、使用示例

線程2依賴於線程1的執行結果

// 線程1執行結果
CompletableFuture.supplyAsync(() -> "hello ")
                 // 消費線程1執行結果
                 .thenAccept(x -> System.out.println(x + "world"));

輸出結果:

hello world

線程3依賴於線程1和線程2執行結果的合並

// 線程1執行結果
CompletableFuture.supplyAsync(() -> "hello ")
                 // 結合線程2執行結果
                 .thenCombineAsync(CompletableFuture.supplyAsync(() -> "world"), (x, y) -> x + y)
                 // 消費線程1和2的合並結果
                 .thenAccept(x -> System.out.println(x));

輸出結果:

hello world

異步任務的編排,實際上是對同步和異步的交點進行了控制,Completable把這個控制邏輯從業務任務代碼中抽離了出來。這樣你可以更加專注於編寫異步任務中的代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM