Future 接口介绍
Java5 新增了 Future 接口,用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的 CPU 资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式呢?即当计算结果完成及时通知监听者(回调)。
Future存在的一些短板
- 不能手动完成计算
- 调用 get() 方法会阻塞程序
- 不能链式执行
- 整合多个 Future 执行结果方式笨重
- 没有好的异常处理方案
CompletableFuture介绍
Java 8 中, 新增加了一个包含 50 个方法左右的类–CompletableFuture,它提供了非常强大的 Future 的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
实现了 Future 接口
实现了 Future 接口,那就具有 Future 接口的相关特性
实现了 CompletionStage 接口
CompletionStage 接口实际上提供了同步或异步运行计算的舞台,所以我们可以通过实现多个 CompletionStage 命令,并且将这些命令串联在一起的方式实现多个命令之间的触发。
带有
then
通常是串行的表现
带有
combine
或者and
通常是聚合and
带有
Either
通常是聚合or
带有
handle
或者exceptionally
通常用来处理异常
快速开始
1. 创建实例
CompletableFuture<String> completableFuture = new CompletableFuture<>();
System.out.println(completableFuture.get());
这个时候会发现,程序会一直处于阻塞状态,因为get()
方法在任务结束之前将一直处在阻塞状态。这时需要我们调用complete()
方法去手动完成。
CompletableFuture<String> completableFuture = new CompletableFuture<>();
completableFuture.complete("hello");
System.out.println(completableFuture.get());
2. runAsync
静态方法。使用runAsnc
进行一次异步计算
CompletableFuture<Void> hello = CompletableFuture.runAsync(() -> System.out.println("运行在一个单独的线程当中"));
hello.get();
runAsync
里面传入的runnable是异步去执行,当我们没有传入Executor
时,它会使用默认的连接池。
3. supplyAsync
静态方法。supplyAsync
是带有返回值的
CompletableFuture