导读
本文从实例出发,介绍 CompletableFuture 基本用法。不过讲的再多,不如亲自上手练习一下。所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture。
全文摘要:
- Future VS CompletableFuture
- CompletableFuture 基本用法
0x00. 前言
一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。 Java 提供 Runnable Future 两个接口用来实现异步任务逻辑。
虽然 Future 可以获取任务执行结果,但是获取方式十方不变。我们不得不使用Future#get 阻塞调用线程,或者使用轮询方式判断 Future#isDone 任务是否结束,再获取结果。
这两种处理方式都不是很优雅,JDK8 之前并发类库没有提供相关的异步回调实现方式。没办法,我们只好借助第三方类库,如 Guava,扩展 Future,增加支持回调功能。相关代码如下:
虽然这种方式增强了 Java 异步编程能力,但是还是无法解决多个异步任务需要相互依赖的场景。
举一个生活上的例子,假如我们需要出去旅游,需要完成三个任务:
- 任务一:订购航班
- 任务二:订购酒店
- 任务三:订购租车服务
很显然任务一和任务二没有相关性,可以单独执行。但是任务三必须等待任务一与任务二结束之后,才能订购租车服务。
为了使任务三时执行时能获取到任务一与任务二执行结果,我们还需要借助 CountDownLatch 。
0x01. CompletableFuture
JDK8 之后,Java 新增一个功能十分强大的类:CompletableFuture。单独使用这个类就可以轻松的完成上面的需求:
大家可以先不用管 CompletableFuture 相关 API,下面将会具体讲解。
对比 Future,CompletableFuture 优点在于:
- 不需要手工分配线程,JDK 自动分配
- 代码语义清晰,异步任务链式调用
- 支持编排异步任务
怎么样,是不是功能很强大?接下来抓稳了,小黑哥要发车了。
1.1 方法一览
首先来通过 IDE 查看下这个类提供的方法:
稍微数一下,这个类总共有 50 多个方法&#x