使用CompletableFuture构建异步应用
Future 接口的局限性
Future
接口可以构建异步应用,但依然有其局限性。它很难直接表述多个Future 结果之间的依赖性。实际开发中,我们经常需要达成以下目的:
- 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。
- 等待 Future 集合中的所有任务都完成。
- 仅等待 Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。
- 通过编程方式完成一个Future任务的执行(即以手工设定异步操作结果的方式)。
- 应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)
新的CompletableFuture类将使得这些成为可能。
CompletableFuture
JDK1.8才新加入的一个实现类CompletableFuture
,实现了Future<T>
, CompletionStage<T>
两个接口。
当一个Future可能需要显示地完成时,使用CompletionStage
接口去支持完成时触发的函数和操作。
当两个及以上线程同时尝试完成、异常完成、取消一个CompletableFuture
时,只有一个能成功。
CompletableFuture
实现了CompletionStage
接口的如下策略:
-
为了完成当前的
CompletableFuture
接口或者其他完成方法的回调函数的线程,提供了非异步的完成操作。 -
没有显式入参
Executor
的所有async
方法都使用ForkJoinPool.commonPool()
为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口AsynchronousCompletionTask
的实例。 -
所有的
CompletionStage
方法都是独立于其他共有方法实现的,因此一个方法的行为不会受到子类中其他方法的覆盖。
CompletableFuture
实现了Future
接口的如下策略:
-
CompletableFuture
无法直接控制完成,所以cancel
操作被视为是另一种异常完成形式。方法isCompletedExceptionally
可以用来确定一个CompletableFuture
是否以任何异常的方式完成。 -
以一个
CompletionException
为例,方法<