Java 9 CompletableFuture 进化小脚步
簡介
Java 9附帶了對CompletableFuture類的一些更改。這些更改是作為JEP 266的一部分引入的,以便解決自JDK 8引入以來的一些問題,更具體地說,支持延遲和超時,抽象出一個工具類和一些實用方法。
代碼方面,API提供了八種新方法和五種新的靜態(tài)方法。根據(jù)Open JDK描述,為了實現(xiàn)這樣的添加,大約2400個代碼行中的1500處被更改。
實例API添加
如上所述,實例API附帶了八個新增功能,它們是:
- Executor defaultExecutor()
- CompletableFuture newIncompleteFuture()
defaultExecutor()方法
API
Executor defaultExecutor() 復制代碼返回默認的Executor用于那些沒有指定異步方法的調(diào)用者。
new CompletableFuture().defaultExecutor()復制代碼這可以由返回執(zhí)行線程的子類覆蓋,該執(zhí)行線程至少提供一個獨立的線程。
newIncompleteFuture()方法
API
CompletableFuture <U> newIncompleteFuture() 復制代碼該newIncompleteFuture,也被稱為“虛擬構(gòu)造函數(shù)”,是用來獲得相同類型的新completable實例。
new CompletableFuture().newIncompleteFuture() 復制代碼當子類化CompletableFuture時,此方法特別有用,主要是因為它幾乎在所有返回新的CompletionStage的方法內(nèi)部使用,允許子類控制此類方法返回的子類型。
copy()方法
API
CompletableFuture <T> copy() 復制代碼此方法返回一個新的CompletableFuture,其中:
當原來的CompletableFuture是執(zhí)行正常的,那么copy之后的CompletableFuture也會是正常的。
當原來的CompletableFuture拋出了異常 Exception X,那么copy之后的CompletableFuture也會出現(xiàn) Exception X
new CompletableFuture().copy() 復制代碼此方法可用作“防御性復制”的形式,能夠在CompletableFuture的特定實例上安排依賴操作。
minimalCompletionStage()方法
API
CompletionStage <T> minimalCompletionStage() 復制代碼此方法返回一個新的CompletionStage,其行為方式與copy方法描述的完全相同,然而,在每次嘗試檢索或設置已解析的值時,此類新實例都會拋出UnsupportedOperationException。
new CompletableFuture().minimalCompletionStage() 復制代碼可以使用CompletionStage API 上提供的toCompletableFuture方法檢索具有所有可用方法的新CompletableFuture。
completeAsync()方法
該completeAsync方法應當用于完成CompletableFuture異步使用由給定的值Supplier提供。
API
CompletableFuture<T> completeAsync(Supplier<? extends T> supplier, Executor executor) CompletableFuture<T> completeAsync(Supplier<? extends T> supplier) 復制代碼這兩個重載方法之間的區(qū)別在于存在第二個參數(shù),其中可以指定運行任務的Executor。如果未提供,則將使用默認執(zhí)行程序(由defaultExecutor方法返回)。
orTimeout()方法
API
CompletableFuture<T> orTimeout(long timeout, TimeUnit unit) 復制代碼new CompletableFuture().orTimeout(1, TimeUnit.SECONDS) 復制代碼除非在指定的超時之前完成CompletableFuture,否則使用TimeoutException異常解析CompletableFuture。
completeOnTimeout()方法
API
CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit) 復制代碼new CompletableFuture().completeOnTimeout(value, 1, TimeUnit.SECONDS) 復制代碼除非在指定的超時之前完成,否則通常使用指定的值完成CompletableFuture。
static API
還添加了一些實用方法。他們是:
- Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
- Executor delayedExecutor(long delay, TimeUnit unit)
- CompletionStage completedStage(U value)
方法延遲執(zhí)行
Executor delayedExecutor(long delay, TimeUnit unit, Executor executor) Executor delayedExecutor(long delay, TimeUnit unit) 復制代碼返回一個新的Executor,它在給定的延遲之后將任務提交給給定的基本執(zhí)行程序(如果非正數(shù)則沒有延遲)。每次延遲都在調(diào)用返回的執(zhí)行程序的execute方法時開始。如果未指定執(zhí)行程序,則將使用默認執(zhí)行程序(ForkJoinPool.commonPool())。
方法completedStage和failedStage
API
<U> CompletionStage<U> completedStage(U value) <U> CompletionStage<U> failedStage(Throwable ex) 復制代碼此實用程序方法返回已解析的CompletionStage實例,這些實例通常使用值(completedStage)完成,或者使用給定的異常完成異常(failedStage)。
方法failedFuture
API
<U> CompletableFuture<U> failedFuture(Throwable ex) 復制代碼failedFuture方法添加了指定已完成的異常CompleatebleFuture實例的功能。
示例用例
將展示一些有關如何使用某些新API的示例。
Delay
此示例將說明如何將具有特定值的CompletableFuture的完成延遲一秒。這可以通過將completeAsync方法與delayedExecutor一起使用來實現(xiàn)。
CompletableFuture<Object> future = new CompletableFuture<>(); future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS)); 復制代碼completeOnTimeout
實現(xiàn)延遲結(jié)果的另一種方法是使用completeOnTimeout方法。此示例定義了一個CompletableFuture,如果在1秒后仍未解析,則將使用給定輸入解析該CompletableFuture。
CompletableFuture<Object> future = new CompletableFuture<>(); future.completeOnTimeout(input, 1, TimeUnit.SECONDS); 復制代碼Timeout
另一種可能性是超時,它使用TimeoutException異常地解決了未來。例如,如果在此之前沒有完成,則在1秒后使CompletableFuture超時。
CompletableFuture<Object> future = new CompletableFuture<>(); future.orTimeout(1, TimeUnit.SECONDS); 復制代碼結(jié)論
總之,Java 9附帶了一些CompletableFuture API,它現(xiàn)在可以更好地支持子類化,由于newIncompleteFuture虛擬構(gòu)造函數(shù),可以控制大多數(shù)CompletionStage API中返回的CompletionStage實例。
如前所示,它肯定能更好地支持延遲和超時。添加的實用程序方法遵循合理的模式,為CompletableFuture提供了指定已解析實例的便捷方式。
總結(jié)
以上是生活随笔為你收集整理的Java 9 CompletableFuture 进化小脚步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看网络流量
- 下一篇: mysql下count(*)和count