java8 CompletableFuture異步編程


Future 接口的局限性

Future接口可以構建異步應用,但依然有其局限性。它很難直接表述多個Future 結果之間的依賴性。實際開發中,我們經常需要達成以下目的:

將兩個異步計算合並為一個——這兩個異步計算之間相互獨立,同時第二個又依賴於第一個的結果。
等待 Future 集合中的所有任務都完成。
僅等待 Future集合中最快結束的任務完成(有可能因為它們試圖通過不同的方式計算同一個值),並返回它的結果。
通過編程方式完成一個Future任務的執行(即以手工設定異步操作結果的方式)。
應對 Future 的完成事件(即當 Future 的完成事件發生時會收到通知,並能使用 Future 計算的結果進行下一步的操作,不只是簡單地阻塞等待操作的結果)

新的CompletableFuture類將使得這些成為可能。
CompletableFuture

JDK1.8才新加入的一個實現類CompletableFuture,實現了Future<T>, CompletionStage<T>兩個接口。

當一個Future可能需要顯示地完成時,使用CompletionStage接口去支持完成時觸發的函數和操作。

當兩個及以上線程同時嘗試完成、異常完成、取消一個CompletableFuture時,只有一個能成功。

CompletableFuture實現了CompletionStage接口的如下策略:

1、為了完成當前的CompletableFuture接口或者其他完成方法的回調函數的線程,提供了非異步的完成操作。

2、沒有顯式入參Executor的所有async方法都使用ForkJoinPool.commonPool()為了簡化監視、調試和跟蹤,所有生成的異步任務都是標記接口AsynchronousCompletionTask的實例。

3、所有的CompletionStage方法都是獨立於其他共有方法實現的,因此一個方法的行為不會受到子類中其他方法的覆蓋。

CompletableFuture實現了Futurre接口的如下策略:

1、CompletableFuture無法直接控制完成,所以cancel操作被視為是另一種異常完成形式。方法isCompletedExceptionally可以用來確定一個CompletableFuture是否以任何異常的方式完成。

2、以一個CompletionException為例,方法get()和get(long,TimeUnit)拋出一個ExecutionException,對應CompletionException。為了在大多數上下文中簡化用法,這個類還定義了方法join()和getNow,而不是直接在這些情況中直接拋出CompletionException。

CompletableFuture中4個異步執行任務靜態方法:

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) { 

  return asyncSupplyStage(asyncPool, supplier);
}

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor) {

  return asyncSupplyStage(screenExecutor(executor), supplier);
}

public static CompletableFuture<Void> runAsync(Runnable runnable) {

  return asyncRunStage(asyncPool, runnable);
}

public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) {

  return asyncRunStage(screenExecutor(executor), runnable);
}

 其中supplyAsync用於有返回值的任務,runAsync則用於沒有返回值的任務。Executor參數可以手動指定線程池,否則默認ForkJoinPool.commonPool()系統級公共線程池, 


免責聲明!

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



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