类架构:
可以看到CompletableFuture类实现了Future和CompletionStage两个接口
接口CompletionStage
代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发
类CompletableFuture
提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法它可能代表一个明确完成的Future,也可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作
CompletableFuture
- get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。
- isDene()方法容易耗费cpu资源(cpu空转),
- 对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果
jdk8设计出CompletableFuture,CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。
CompletableFuture优点:
- 异步任务结束时,会自动回调某个对象的方法
- 主线程设置好回调后,不用关心异步任务的执行,异步任务之间可以顺序执行
- 异步任务出错时,会自动回调某个对象的方法
四个构造方法
若没有指定,则使用默认的ForkJoinPoolcommonPool()作为它的线程池执行异步代码,如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码
CompletableFuture常用方法
- 获得结果和触发计算
- 获取结果
- public T get()
- public T get(long timeout,TimeUnit unit)
- public T join() --->和get一样的作用,只是不需要抛出异常
- public T getNow(T valuelfAbsent) --->计算完成就返回正常值,否则返回备胎值(传入的参数),立即获取结果不阻塞
- 获取结果
- 主动触发计算
- public boolean complete(T value) ---->是否打断get方法立即返回括号值
- 对计算结果进行处理
- thenApply --->计算结果存在依赖关系,这两个线程串行化---->由于存在依赖关系(当前步错,不走下一步),当前步骤有异常的话就叫停
- handle --->计算结果存在依赖关系,这两个线程串行化---->有异常也可以往下走一步
- 对计算结果进行消费
- 接受任务的处理结果,并消费处理,无返回结果
- thenAccept
- 对计算速度进行选用
- 谁快用谁
- applyToEither
- 谁快用谁
- 对计算结果进行合并
- 两个CompletableStage任务都完成后,最终能把两个任务的结果一起交给thenCombine来处理
- 先完成的先等着,等待其他分支任务
- 接受任务的处理结果,并消费处理,无返回结果