Future是Java 5添加的類,用來描述一個異步計算的結果.java
boolean cancel (boolean mayInterruptIfRunning) //取消執行此任務編程
boolean isCancled () 若此任務在正常完成前被取消則返回true.app
boolean isDone() //當前任務是否完成
可能的狀況有:正常完成,異常,取消執行.在這些狀況下將會返回true.dom
V get() throws InterruptedException,ExecutionException //若是必要的話,等待計算完成,並返回其結果異步
V get(long timeout,TimeUnit unit) throws InterruptedException,ExecutionException,TimeoutException //若是必要的話,等待計算完成,並返回其結果函數式編程
CompletableFuture實現了Future及CompletionStage接口,是Java 8 新增的一個類.提供了很是強大的Future的擴展功能,能夠幫助咱們簡化異步編程的複雜性,提供了函數式編程的能力,能夠經過回調的方式處理計算結果,而且提供了轉換和組合CompletableFuture的方法。異步編程
一個Future能夠被明確的完成(設置它的值或狀態);而且看成爲一個CompletionStage使用時能夠支持依賴函數和當任務完成時觸發相應動做的使用.函數
當兩個或多個線程試圖 complete, completeExceptionally或 cancel 一個CompletableFuture時,只有一個線程能成功。線程
CompletableFuture實現了CompletionStage接口方法中的如下策略:debug
static interface CompletableFuture.AsynchronousCompletionTask //一個標識接口,用於標識由異步方法產生的異步任務,可能用於監控,debug,追蹤異步活動.
注意:在下文中: 不以Async結尾,意味着Action使用相同的線程執行,而Async可能會使用其它的線程去執行(若是使用相同的線程池,也可能會被同一個線程選中執行)。
能夠根據方法的參數的類型來加速你的記憶。Runnable類型的參數會忽略計算的結果,Consumer是純消費計算結果,BiConsumer會組合另一個CompletionStage純消費,Function會對計算結果作轉換,BiFunction會組合另一個CompletionStage的計算結果作轉換。
public CompletableFuture() //建立一個不完整的CompletableFuture
a)CompletableFuture.completedFuture(U value)是一個靜態輔助方法,用來返回一個已經計算好的CompletableFuture。
public static <U> CompletableFuture<U> completedFuture(U value)
b)爲異步執行的代碼建立CompletableFuture建立對象的靜態方法
public static CompletableFuture<Void> runAsync(Runnable runnable) public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
(1). 第一組
當CompletableFuture的計算結果完成,或者拋出異常的時候,咱們能夠執行特定的Action。主要是下面的方法:
public CompletableFuture<T> whenComplete(BiConsumer<? super T,? super Throwable> action) public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? super Throwable> action) public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? super Throwable> action, Executor executor) public CompletableFuture<T> exceptionally(Function<Throwable,? extends T> fn)
(2). 第二組
這一組方法雖然也返回CompletableFuture對象,可是對象的值和原來的CompletableFuture計算的值不一樣,會生成新的計算結果.當原先的CompletableFuture的值計算完成或者拋出異常的時候,會觸發這個CompletableFuture對象的計算,結果由BiFunction參數計算而得。所以這組方法兼有whenComplete和轉換(thenAply)的兩個功能。
public <U> CompletableFuture<U> handle(BiFunction<? super T,Throwable,? extends U> fn) public <U> CompletableFuture<U> handleAsync(BiFunction<? super T,Throwable,? extends U> fn) public <U> CompletableFuture<U> handleAsync(BiFunction<? super T,Throwable,? extends U> fn, Executor executor)
轉換時沒必要由於等待一個計算完成而阻塞着調用線程(好比Future的get()方法),而是告訴CompletableFuture當計算完成的時候請執行某個function。並且咱們還能夠將這些操做串聯起來,或者將CompletableFuture組合起來。
public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) public <U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn) public <U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor)
public CompletableFuture<Void> thenAccept(Consumer<? super T> action) public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action) public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action, Executor executor)
功能:只對結果執行Action,而不返回新的計算值.
public <U> CompletableFuture<Void> thenAcceptBoth(CompletionStage<? extends U> other, BiConsumer<? super T,? super U> action) public <U> CompletableFuture<Void> thenAcceptBothAsync(CompletionStage<? extends U> other, BiConsumer<? super T,? super U> action) public <U> CompletableFuture<Void> thenAcceptBothAsync(CompletionStage<? extends U> other, BiConsumer<? super T,? super U> action, Executor executor) public CompletableFuture<Void> runAfterBoth(CompletionStage<?> other, Runnable action)
(1):第一組
public <U> CompletableFuture<U> thenCompose(Function<? super T,? extends CompletionStage<U>> fn) public <U> CompletableFuture<U> thenComposeAsync(Function<? super T,? extends CompletionStage<U>> fn) public <U> CompletableFuture<U> thenComposeAsync(Function<? super T,? extends CompletionStage<U>> fn, Executor executor)
(2):第二組
public <U,V> CompletableFuture<V> thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn) public <U,V> CompletableFuture<V> thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn) public <U,V> CompletableFuture<V> thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn, Executor executor)
public CompletableFuture<Void> acceptEither(CompletionStage<? extends T> other, Consumer<? super T> action) public CompletableFuture<Void> acceptEitherAsync(CompletionStage<? extends T> other, Consumer<? super T> action) public CompletableFuture<Void> acceptEitherAsync(CompletionStage<? extends T> other, Consumer<? super T> action, Executor executor) public <U> CompletableFuture<U> applyToEither(CompletionStage<? extends T> other, Function<? super T,U> fn) public <U> CompletableFuture<U> applyToEitherAsync(CompletionStage<? extends T> other, Function<? super T,U> fn) public <U> CompletableFuture<U> applyToEitherAsync(CompletionStage<? extends T> other, Function<? super T,U> fn, Executor executor)
例子:可能輸出100,也可能輸出200
Random rand = new Random(); CompletableFuture< Integer > future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(10000 + rand.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } return 100; }); CompletableFuture< Integer > future2 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(10000 + rand.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } return 200; }); CompletableFuture<String> f = future.applyToEither(future2,i -> i.toString());
public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)
anyOf()與applyToEither()的區別: