一、引入背景
1. 异步计算:调用一个函数,无需等待被调用函数的返回结果,接着执行程序
2. 可以启动线程进行异步计算
3. 使用Future异步计算,可以拿到计算结果,可以结合线程池使用
4. Future的缺点:阻塞式或者轮询等待结果,并且很难直接表述多个future的结果之间的依赖性
5. CompletableFuture是Future的优化,可以进行组合
二、CompletionStage接口
1. CompletionStage表示异步计算过程中的某一个阶段
2. 一个阶段完成后,可能会触发另一个阶段
3. 一个阶段的执行:Function, Consumer, Runnable
三、CompletableFuture类
1. 实现了Future接口(明确完成的Future)和CompletionStage接口(某个完成阶段)
2. 创建CompletableFuture对象,有四种方法
public static CompletableFuture<Void> runAsync(Runnable runnable) public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
四、使用CompletableFuture对象
1. 变换结果
2. 消费结果
3. 结合两个CompletionStage的结果,转化后返回
4. 两个CompletionStage,谁计算的快,就用哪个的结果进行下一步处理,thenApply
5. 出现异常后用exceptionally进行补偿
参考:
https://www.cnblogs.com/happyliu/archive/2018/08/12/9462703.html
https://www.cnblogs.com/cjsblog/p/9267163.html