CompletableFuture【Java】
简介
CompletableFuture是Java异步编程中常用的类,CompletableFuture 继承了 Future 和 CompletionStage 两个接口,Future接口提供了 CompletableFuture 对结果的异步处理能力,CompletionStage 则提供了流式处理的能力,方便对异步流程进行关联组合和流式处理。
Future是Java语言中非常重要的异步类,其语义类似于调用中的凭证和票据,在异步场景下,调用方之行调用之后获取Future就可以直接返回,调用Future获取结果的时候,如果结果还没有返回,会进入阻塞状态,直至可以获取返回结果。
Future经常用于多个请求的并行调用,因为Future的异步机制可以将该类调用的耗时从多个请求的耗时之和变为最长的耗时。
Future的缺点在于多个Future不能进行组合以及串联,Future在阻塞的获取结果之前没办法进行其他的操作,Future也缺少异常处理机制。
通过引入CompletionStage,CompletableFuture具备了流失处理的总总能力。
原理
CompletableFuture利用了CompletionStage实现了顺序结构,组合结构以及回调结构。主要的API如下所示:
流程类型 | API | 主要功能 |
---|---|---|
顺序结构 | supplyAsync/ runAsync | 创建thenApply,并异步执行,supplyAsync允许返回值,runAsync则没有返回值。 |
thenApply/thenAccept | 对CompletableFuture的结果进行处理,返回新的CompletableFuture,一般用于顺序执行多个CompletableFuture。
不同点是thenApply可能会修改返回对象的范型值。 | |
thenCompose/thenRun | 对CompletableFuture的结果进行处理,不需要返回值。
thenCompose处理的是上一个CompletableFuture,thenRun处理的是CompletableFuture返回的具体的值。 | |
组合结构 | thenCombine/thenAcceptBoth | 将两个CompletableFuture组合成一个新的CompletableFuture。
不同点是 thenAcceptBoth传入的执行函数没返回值,即返回CompletableFuture<Void> |
runAfterBoth/applyToEither/
acceptEither/runAfterEither/ allOf/anyOf |
可以根据不同的条件进行后续CompletableFuture的触发。 | |
回调 | handle/whenComplete | 可以获取CompletableFuture的上下文,例如异常信息。
handle返回的处理结果和异常,whenComplete不包含值。 |
CompletableFuture通过组合和顺序关系会形成一个树状的结构。
内层的CompletableFuture会注册到外层的CompletableFuture,同一个外层CompletableFuture的注册者会构成一个链表实现的栈结构。外层的CompletableFuture会通过观察者模式接受注册者的返回,继续后续的流程和逻辑。