CompletableFuture详解~创建实例
創(chuàng)建 CompletableFuture 對象實例我們可以使用如下幾個方法:
static CompletableFuture<U> completedFuture(U value)//使用forkjoin公共線程池 static CompletableFuture<Void> runAsync(Runnable runnable) static CompletableFuture<U> supplyAsync(Supplier<U> supplier)//使用自定義線程池 static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) static CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)第一個方法創(chuàng)建一個具有默認結(jié)果的 CompletableFuture,這個沒啥好講。我們重點講述下下面四個異步方法。
前兩個方法 runAsync 不支持返回值,而 supplyAsync可以支持返回結(jié)果。
這個兩個方法默認將會使用公共的?ForkJoinPool?線程池執(zhí)行,這個線程池默認線程數(shù)是?CPU?的核數(shù)。
| 可以設(shè)置 JVM option:-Djava.util.concurrent.ForkJoinPool.common.parallelism 來設(shè)置 ForkJoinPool 線程池的線程數(shù) |
使用共享線程池將會有個弊端,一旦有任務(wù)被阻塞,將會造成其他任務(wù)沒機會執(zhí)行。所以強烈建議使用后兩個方法,根據(jù)任務(wù)類型不同,主動創(chuàng)建線程池,進行資源隔離,避免互相干擾。
-------------------------------------------------------
CompletableFuture的創(chuàng)建:
-
說明:
-
兩個重載方法之間的區(qū)別 => 后者可以傳入自定義Executor,前者是默認的,使用的ForkJoinPool
-
supplyAsync和runAsync方法之間的區(qū)別 => 前者有返回值,后者無返回值
-
Supplier是函數(shù)式接口,因此該方法需要傳入該接口的實現(xiàn)類,追蹤源碼會發(fā)現(xiàn)在run方法中會調(diào)用該接口的方法。因此使用該方法創(chuàng)建CompletableFuture對象只需重寫Supplier中的get方法,在get方法中定義任務(wù)即可。又因為函數(shù)式接口可以使用Lambda表達式,和new創(chuàng)建CompletableFuture對象相比代碼會簡潔不少
-
使用new方法
-
使用CompletableFuture#completedFuture靜態(tài)方法創(chuàng)建
public static <U> CompletableFuture<U> completedFuture(U value) {return new CompletableFuture<U>((value == null) ? NIL : value); }-
參數(shù)的值為任務(wù)執(zhí)行完的結(jié)果,一般該方法在實際應(yīng)用中較少應(yīng)用
-
使用 CompletableFuture#supplyAsync靜態(tài)方法創(chuàng)建 supplyAsync有兩個重載方法:
-
使用CompletableFuture#runAsync靜態(tài)方法創(chuàng)建 runAsync有兩個重載方法
結(jié)果的獲取:?對于結(jié)果的獲取CompltableFuture類提供了四種方式
//方式一 public T get() //方式二 public T get(long timeout, TimeUnit unit) //方式三 public T getNow(T valueIfAbsent) //方式四 public T join()-
說明:
示例:
-
get()和get(long timeout, TimeUnit unit) => 在Future中就已經(jīng)提供了,后者提供超時處理,如果在指定時間內(nèi)未獲取結(jié)果將拋出超時異常
-
getNow => 立即獲取結(jié)果不阻塞,結(jié)果計算已完成將返回結(jié)果或計算過程中的異常,如果未計算完成將返回設(shè)定的valueIfAbsent值
-
join => 方法里不會拋出異常
-
說明:
-
第一個執(zhí)行結(jié)果為hello h2t,因為要先睡上1分鐘結(jié)果不能立即獲取
-
join方法獲取結(jié)果方法里不會拋異常,但是執(zhí)行結(jié)果會拋異常,拋出的異常為CompletionException
-
get方法獲取結(jié)果方法里將拋出異常,執(zhí)行結(jié)果拋出的異常為ExecutionException
-
異常處理:?使用靜態(tài)方法創(chuàng)建的CompletableFuture對象無需顯示處理異常,使用new創(chuàng)建的對象需要調(diào)用completeExceptionally方法設(shè)置捕獲到的異常,舉例說明:
總結(jié)
以上是生活随笔為你收集整理的CompletableFuture详解~创建实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辨别 Python 中 load 和 l
- 下一篇: Anaconda 完全入门指南