文章目录
CompletableFuture
1、CompletableFuture是什么?
CompletableFuture是Java 8中引入的一个类,它实现了Future接口,用于表示异步计算的结果。与Future不同,CompletableFuture提供了更丰富的方法来处理计算过程中的异常、组合多个计算任务以及链式调用等。
CompletableFuture的定义:

CompletableFuture 实现了两个接口(如上图所示):Future、CompletionStage。 Future 表示异步计算的结果,CompletionStage用于表示异步执行过程中的一个步骤(Stage),这个步骤可能是由另外一个CompletionStage触发的,随着当前步骤的完成,也可能会触发其他一系列CompletionStage的执行。从而我们可以根据实际业务对这些步骤进行多样化的编排组合,CompletionStage接口正是定义了这样的能力,我们可以通过其提供的thenAppy、thenCompose等函数式编程方法来组合编排这些步骤。
2、为什么使用CompletableFuture?
2.1 Future的局限性
在Java8之前我们一般通过Future实现异步,Future用于表示异步计算的结果。
- 只能通过
get()阻塞或者isDone()轮询的方式获取结果。 - 不支持设置回调方法,Java 8之前若要设置回调一般会使用guava的 ListenableFuture,回调的引入又会导致臭名昭著的回调地狱。
- 不能将多个Future合并在一起。 假设你有多种不同的Future, 你想在它们全部并行完成后然后运行某个函数,Future很难独立完成这一需要。
- 没有异常处理。 Future提供的方法中没有专门的API应对异常处理,还需要开发者自己手动异常处理。
下面将举例来说明,我们通过Future、ListenableFuture来实现异步回调:
例子:替换文章中的敏感词。
- 读取文章,step1
- 读取敏感词,step2
- 替换敏感词,step3
其中step3依赖step1、step2的结果。
public static void main(String[] args) {
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
// 对ExecutorService进行装饰成为ListeningExecutorService,Future ==>ListenableFuture,使其具有监听任务执行状态的功能,并能进行回调
ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);
// 读取文章,step1
ListenableFuture<String> future1 = guavaExecutor.submit(CommonUtils::readArticle);
// 读取敏感词,step2
ListenableFuture<Map<String,String>> future2 = guavaExecutor.submit(CommonUtils::readWords);
ListenableFuture<List<Object>> future1And2 = Futures.allAsList(future1, future2);
// 执行step1、step2的回调
Futures.addCallback(future1And2, new FutureCallback<List<Object>>() {
@Override
public void onSuccess(List<Object> result) {
// step1、step2 执行完成,并获取结果
String article = (String) result.get(0);
Map<String,String> words = (Map<String, String>) result.get(1);
// 替换敏感词,step3,并将结果回调打印出来
ListenableFuture<String> future3 = guavaExecutor.submit(() -> CommonUtils.replace(article, words));
Futures.addCallback(future3, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
CommonUtils.printTheadLog(result);
}
@Override
public void onFailure(Throwable t) {
}
}, guavaExecutor);
}
@Override
public void onFailure(Throwable t) {
}
}, guavaExecutor);
}
2.2 CompletableFuture的优势
CompletableFuture相对于Future具有以下的优势:
- 为快速创建、链接依赖和结合多个Future提供了大量的便利方法。

最低0.47元/天 解锁文章
169万+






