Java 9附帶了對CompletableFuture類的一些更改。這些更改是做爲JEP 266的一部分引入的,以便解決自JDK 8引入以來的一些問題,更具體地說,支持延遲和超時,抽象出一個工具類和一些實用方法。java
代碼方面,API提供了八種新方法和五種新的靜態方法。根據Open JDK描述,爲了實現這樣的添加,大約2400個代碼行中的1500處被更改。bash
如上所述,實例API附帶了八個新增功能,它們是:異步
API函數
Executor defaultExecutor()
複製代碼
返回默認的Executor用於那些沒有指定異步方法的調用者。工具
new CompletableFuture().defaultExecutor()
複製代碼
這能夠由返回執行線程的子類覆蓋,該執行線程至少提供一個獨立的線程。spa
API.net
CompletableFuture <U> newIncompleteFuture()
複製代碼
該newIncompleteFuture,也被稱爲「虛擬構造函數」,是用來得到相同類型的新completable實例。線程
new CompletableFuture().newIncompleteFuture()
複製代碼
當子類化CompletableFuture時,此方法特別有用,主要是由於它幾乎在全部返回新的CompletionStage的方法內部使用,容許子類控制此類方法返回的子類型。code
APIget
CompletableFuture <T> copy()
複製代碼
此方法返回一個新的CompletableFuture,其中:
當原來的CompletableFuture是執行正常的,那麼copy以後的CompletableFuture也會是正常的。
當原來的CompletableFuture拋出了異常 Exception X,那麼copy以後的CompletableFuture也會出現 Exception X
new CompletableFuture().copy()
複製代碼
此方法可用做「防護性複製」的形式,可以在CompletableFuture的特定實例上安排依賴操做。
API
CompletionStage <T> minimalCompletionStage()
複製代碼
此方法返回一個新的CompletionStage,其行爲方式與copy方法描述的徹底相同,然而,在每次嘗試檢索或設置已解析的值時,此類新實例都會拋出UnsupportedOperationException。
new CompletableFuture().minimalCompletionStage()
複製代碼
可使用CompletionStage API 上提供的toCompletableFuture方法檢索具備全部可用方法的新CompletableFuture。
該completeAsync方法應當用於完成CompletableFuture異步使用由給定的值Supplier提供。
API
CompletableFuture<T> completeAsync(Supplier<? extends T> supplier, Executor executor)
CompletableFuture<T> completeAsync(Supplier<? extends T> supplier)
複製代碼
這兩個重載方法之間的區別在於存在第二個參數,其中能夠指定運行任務的Executor。若是未提供,則將使用默認執行程序(由defaultExecutor方法返回)。
API
CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
複製代碼
new CompletableFuture().orTimeout(1, TimeUnit.SECONDS)
複製代碼
除非在指定的超時以前完成CompletableFuture,不然使用TimeoutException異常解析CompletableFuture。
API
CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
複製代碼
new CompletableFuture().completeOnTimeout(value, 1, TimeUnit.SECONDS)
複製代碼
除非在指定的超時以前完成,不然一般使用指定的值完成CompletableFuture。
還添加了一些實用方法。他們是:
Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
Executor delayedExecutor(long delay, TimeUnit unit)
複製代碼
返回一個新的Executor,它在給定的延遲以後將任務提交給給定的基本執行程序(若是非正數則沒有延遲)。每次延遲都在調用返回的執行程序的execute方法時開始。若是未指定執行程序,則將使用默認執行程序(ForkJoinPool.commonPool())。
API
<U> CompletionStage<U> completedStage(U value)
<U> CompletionStage<U> failedStage(Throwable ex)
複製代碼
此實用程序方法返回已解析的CompletionStage實例,這些實例一般使用值(completedStage)完成,或者使用給定的異常完成異常(failedStage)。
API
<U> CompletableFuture<U> failedFuture(Throwable ex)
複製代碼
failedFuture方法添加了指定已完成的異常CompleatebleFuture實例的功能。
將展現一些有關如何使用某些新API的示例。
此示例將說明如何將具備特定值的CompletableFuture的完成延遲一秒。這能夠經過將completeAsync方法與delayedExecutor一塊兒使用來實現。
CompletableFuture<Object> future = new CompletableFuture<>();
future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
複製代碼
實現延遲結果的另外一種方法是使用completeOnTimeout方法。此示例定義了一個CompletableFuture,若是在1秒後仍未解析,則將使用給定輸入解析該CompletableFuture。
CompletableFuture<Object> future = new CompletableFuture<>();
future.completeOnTimeout(input, 1, TimeUnit.SECONDS);
複製代碼
另外一種可能性是超時,它使用TimeoutException異常地解決了將來。例如,若是在此以前沒有完成,則在1秒後使CompletableFuture超時。
CompletableFuture<Object> future = new CompletableFuture<>();
future.orTimeout(1, TimeUnit.SECONDS);
複製代碼
總之,Java 9附帶了一些CompletableFuture API,它如今能夠更好地支持子類化,因爲newIncompleteFuture虛擬構造函數,能夠控制大多數CompletionStage API中返回的CompletionStage實例。
如前所示,它確定能更好地支持延遲和超時。添加的實用程序方法遵循合理的模式,爲CompletableFuture提供了指定已解析實例的便捷方式。