Java 9 CompletableFuture 进化小脚步

简介

Java 9附带了对CompletableFuture类的一些更改。这些更改是作为JEP 266的一部分引入的,以便解决自JDK 8引入以来的一些问题,更具体地说,支持延迟和超时,抽象出一个工具类和一些实用方法。

代码方面,API提供了八种新方法和五种新的静态方法。根据Open JDK描述,为了实现这样的添加,大约2400个代码行中的1500处被更改。

实例API添加

如上所述,实例API附带了八个新增功能,它们是:

  • Executor defaultExecutor()
  • CompletableFuture newIncompleteFuture()
CompletableFuture copy() CompletionStage minimalCompletionStage() CompletableFuture completeAsync(Supplier supplier, Executor executor) CompletableFuture completeAsync(Supplier supplier) CompletableFuture orTimeout(long timeout, TimeUnit unit) CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit)

defaultExecutor()方法

API

Executor defaultExecutor()
复制代码

返回默认的Executor用于那些没有指定异步方法的调用者。

new CompletableFuture().defaultExecutor()

复制代码

这可以由返回执行线程的子类覆盖,该执行线程至少提供一个独立的线程。

newIncompleteFuture()方法

API

CompletableFuture  newIncompleteFuture()
复制代码

该newIncompleteFuture,也被称为“虚拟构造函数”,是用来获得相同类型的新completable实例。

new CompletableFuture().newIncompleteFuture()
复制代码

当子类化CompletableFuture时,此方法特别有用,主要是因为它几乎在所有返回新的CompletionStage的方法内部使用,允许子类控制此类方法返回的子类型。

copy()方法

API

CompletableFuture  copy()
复制代码

此方法返回一个新的CompletableFuture,其中:

当原来的CompletableFuture是执行正常的,那么copy之后的CompletableFuture也会是正常的。

当原来的CompletableFuture抛出了异常 Exception X,那么copy之后的CompletableFuture也会出现 Exception X

new CompletableFuture().copy()
复制代码

此方法可用作“防御性复制”的形式,能够在CompletableFuture的特定实例上安排依赖操作。

minimalCompletionStage()方法

API

CompletionStage  minimalCompletionStage()
复制代码

此方法返回一个新的CompletionStage,其行为方式与copy方法描述的完全相同,然而,在每次尝试检索或设置已解析的值时,此类新实例都会抛出UnsupportedOperationException。

new CompletableFuture().minimalCompletionStage()
复制代码

可以使用CompletionStage API 上提供的toCompletableFuture方法检索具有所有可用方法的新CompletableFuture。

completeAsync()方法

该completeAsync方法应当用于完成CompletableFuture异步使用由给定的值Supplier提供。

API

CompletableFuture completeAsync(Supplier supplier, Executor executor)
CompletableFuture completeAsync(Supplier supplier)
复制代码

这两个重载方法之间的区别在于存在第二个参数,其中可以指定运行任务的Executor。如果未提供,则将使用默认执行程序(由defaultExecutor方法返回)。

orTimeout()方法

API

CompletableFuture orTimeout(long timeout, TimeUnit unit)
复制代码
new CompletableFuture().orTimeout(1, TimeUnit.SECONDS)
复制代码

除非在指定的超时之前完成CompletableFuture,否则使用TimeoutException异常解析CompletableFuture。

completeOnTimeout()方法

API

CompletableFuture 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)
CompletionStage failedStage(Throwable ex) CompletableFuture failedFuture(Throwable ex)

方法延迟执行

Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
Executor delayedExecutor(long delay, TimeUnit unit)
复制代码

返回一个新的Executor,它在给定的延迟之后将任务提交给给定的基本执行程序(如果非正数则没有延迟)。每次延迟都在调用返回的执行程序的execute方法时开始。如果未指定执行程序,则将使用默认执行程序(ForkJoinPool.commonPool())。

方法completedStage和failedStage

API

 CompletionStage completedStage(U value)
 CompletionStage failedStage(Throwable ex)
复制代码

此实用程序方法返回已解析的CompletionStage实例,这些实例通常使用值(completedStage)完成,或者使用给定的异常完成异常(failedStage)。

方法failedFuture

API

 CompletableFuture failedFuture(Throwable ex)
复制代码

failedFuture方法添加了指定已完成的异常CompleatebleFuture实例的功能。

示例用例

将展示一些有关如何使用某些新API的示例。

Delay

此示例将说明如何将具有特定值的CompletableFuture的完成延迟一秒。这可以通过将completeAsync方法与delayedExecutor一起使用来实现。

CompletableFuture future = new CompletableFuture<>();
future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
复制代码 
   

completeOnTimeout

实现延迟结果的另一种方法是使用completeOnTimeout方法。此示例定义了一个CompletableFuture,如果在1秒后仍未解析,则将使用给定输入解析该CompletableFuture。

CompletableFuture future = new CompletableFuture<>();
future.completeOnTimeout(input, 1, TimeUnit.SECONDS);
复制代码 
   

Timeout

另一种可能性是超时,它使用TimeoutException异常地解决了未来。例如,如果在此之前没有完成,则在1秒后使CompletableFuture超时。

CompletableFuture future = new CompletableFuture<>();
future.orTimeout(1, TimeUnit.SECONDS);
复制代码 
   

结论

总之,Java 9附带了一些CompletableFuture API,它现在可以更好地支持子类化,由于newIncompleteFuture虚拟构造函数,可以控制大多数CompletionStage API中返回的CompletionStage实例。

如前所示,它肯定能更好地支持延迟和超时。添加的实用程序方法遵循合理的模式,为CompletableFuture提供了指定已解析实例的便捷方式。

你可能感兴趣的:(java)