CompletableFuture 功能介绍及源码分析

1 背景

上一篇文章中,我们讲了 CompletionService 对 Future的优化,但是有个局限就是只能对多个任务的完成情况进行编排,如果进行链式,组合等处理的话,实现的逻辑会比较复杂。

我们今天所说的CompletableFuture 是对Future 的扩展和增强,完美的弥补Future 的局限性,实现了对任务的多种链式,组合编排。今天我们就CompleteableFuture的功能做个详细的介绍和讲解。

2 功能

CompletableFuture 最主要的就是解决了异步回调的问题,异步调用可以有返回结果,也可以没有返回结果,其中有两个最基本的方法,我们会从源码的角度详细分析,我们先看下里面丰富的调用方法吧。

这里面的方法都有一个特点,正常的不带Async,默认线程池的Async 和带自定义线程池的Async 三种。这些都是重写的方法,会一种就可以了,强烈建议使用自定义线程池的。

3 源码分析

3.1 runAsync 源码分析

基于这个基础的方法,来分析下CompletableFuture 是如何执行异步任务,如何触发后续任务执行的。



这个地方将任务和CompletableFuture封装到一起,作为AsyncRun的对象,将AsyncRun交给线程池执行 (这个线程池可以是默认的,也可是自定义的)



当前任务没执行完成,则执行,如果执行完了,就执行后续任务。



可以看出最底层使用的是栈的结构,然后从栈的顶部开始执行任务。

3.2 thenRun 方法源码分析

后续任务,可以在前继任务执行完成后通过postComplete方法触发,也可以在任务在压栈前后,会尝试执行后续的任务。



如果传递了线程池,代表异步执行,直接走if代码块中的内容,直接进行压栈操作;

如果没有传递线程池,同步执行,需要先执行uniRun,如果没有结果,然后再执行if中的压栈操作。

如果c == null,代表异步执行;如果c != null,嵌套执行,同步执行

最后还是通过线程池的excute 方法进行执行。

4 总结

这是整个CompetableFuture 异步任务执行的流程图,虽说比较复杂,但是流程很清楚。主要就是完成如何异步进行任务执行和 继续后续任务的。

如果你喜欢这篇文章,别忘了关注点赞哦。

展开阅读全文

页面更新:2024-05-30

标签:链式   源码   功能   组合   线程   两个   操作   代表   方法   内容

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top