java8 CompletableFuture异步编程
Future 接口的局限性
Future接口可以構(gòu)建異步應(yīng)用,但依然有其局限性。它很難直接表述多個Future 結(jié)果之間的依賴性。實際開發(fā)中,我們經(jīng)常需要達成以下目的:
將兩個異步計算合并為一個——這兩個異步計算之間相互獨立,同時第二個又依賴于第一個的結(jié)果。
等待 Future 集合中的所有任務(wù)都完成。
僅等待 Future集合中最快結(jié)束的任務(wù)完成(有可能因為它們試圖通過不同的方式計算同一個值),并返回它的結(jié)果。
通過編程方式完成一個Future任務(wù)的執(zhí)行(即以手工設(shè)定異步操作結(jié)果的方式)。
應(yīng)對 Future 的完成事件(即當(dāng) Future 的完成事件發(fā)生時會收到通知,并能使用 Future 計算的結(jié)果進行下一步的操作,不只是簡單地阻塞等待操作的結(jié)果)
新的CompletableFuture類將使得這些成為可能。
CompletableFuture
JDK1.8才新加入的一個實現(xiàn)類CompletableFuture,實現(xiàn)了Future<T>, CompletionStage<T>兩個接口。
當(dāng)一個Future可能需要顯示地完成時,使用CompletionStage接口去支持完成時觸發(fā)的函數(shù)和操作。
當(dāng)兩個及以上線程同時嘗試完成、異常完成、取消一個CompletableFuture時,只有一個能成功。
CompletableFuture實現(xiàn)了CompletionStage接口的如下策略:
1、為了完成當(dāng)前的CompletableFuture接口或者其他完成方法的回調(diào)函數(shù)的線程,提供了非異步的完成操作。
2、沒有顯式入?yún)xecutor的所有async方法都使用ForkJoinPool.commonPool()為了簡化監(jiān)視、調(diào)試和跟蹤,所有生成的異步任務(wù)都是標(biāo)記接口AsynchronousCompletionTask的實例。
3、所有的CompletionStage方法都是獨立于其他共有方法實現(xiàn)的,因此一個方法的行為不會受到子類中其他方法的覆蓋。
CompletableFuture實現(xiàn)了Futurre接口的如下策略:
1、CompletableFuture無法直接控制完成,所以cancel操作被視為是另一種異常完成形式。方法isCompletedExceptionally可以用來確定一個CompletableFuture是否以任何異常的方式完成。
2、以一個CompletionException為例,方法get()和get(long,TimeUnit)拋出一個ExecutionException,對應(yīng)CompletionException。為了在大多數(shù)上下文中簡化用法,這個類還定義了方法join()和getNow,而不是直接在這些情況中直接拋出CompletionException。
CompletableFuture中4個異步執(zhí)行任務(wù)靜態(tài)方法:
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用于有返回值的任務(wù),runAsync則用于沒有返回值的任務(wù)。Executor參數(shù)可以手動指定線程池,否則默認ForkJoinPool.commonPool()系統(tǒng)級公共線程池,?
轉(zhuǎn)載于:https://www.cnblogs.com/leizhuang/p/9968370.html
總結(jié)
以上是生活随笔為你收集整理的java8 CompletableFuture异步编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 03 字符串详解
- 下一篇: 编程语言分类及变量