一、簡介
並發編程中我們經常創建異步線程來執行任務。但是,當異步任務之間存在依賴關系時,使得我們開發過程變得更加復雜。比如:
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把這個控制邏輯從業務任務代碼中抽離了出來。這樣你可以更加專注於編寫異步任務中的代碼。