首页 > 编程语言 >JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?

JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?

时间:2022-12-21 17:03:02浏览次数:44  
标签:返回 JDK 结果 allOf 源码 CompletableFuture cfs


​​JDK源码之CompletableFuture(一)结果返回原理​​JDK源码之CompletableFuture(二)链式调用原理
JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?

目录

  • ​​一、全部返回才返回​​
  • ​​二、allOf源码​​
  • ​​三、一个返回就返回​​
  • ​​四、任一返回就返回的源码​​


之前一篇文章我们从源码说了CompletableFuture的链式调用原理

​​《JDK源码之CompletableFuture(二)链式调用原理》​​,其实CompletableFuture除了链式调用之外呢,还有

全选或者任何一个选中的返回处理,这个是怎么实现的呢?

一、全部返回才返回

就是要等到所有结果都返回之后,才能把最后结果返回,使用示例如下:

CompletableFuture.allOf(integerCompletableFuture2,integerCompletableFuture);

上面一篇链式调用原理我们说了怎么一个future依赖上一个future的结果,而这个全部返回等待,也是一样的原理。

JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?_java

  • 4,5的结果获取到,才去获取2的结果,6的结果获取到才去获取3的结果,2,3的结果获取到,才去获取1的结果,1就是allOf方法返回的那个future
  • 注意:这里的获取结果是有这个顺序,但是程序的执行其实都是并行的,所以并不会影响程序的性能。

二、allOf源码

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) {
return andTree(cfs, 0, cfs.length - 1);
}

从代码中,我们可以看的出来,确实是构建了一个and树,然后进行的处理。

三、一个返回就返回

代表性的语法是:

CompletableFuture.anyOf(integerCompletableFuture2,integerCompletableFuture);

integerCompletableFuture.applyToEither

在多个CompletableFuture的任务中,有任何一个返回了结果,就可以把结果返回回来了,它的实现思路也很明确,画图表示如下:

JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?_Future_02

将最终返回的future放入所有任务的stack属性中,这样任何一个CompletableFuture触发了postComplete()方法就会触发最终future的方法。

四、任一返回就返回的源码

public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs) {
return orTree(cfs, 0, cfs.length - 1);
}

可以看到其构建了一个orTree,原理就是与我们上图说的一致。

这篇文章是我解读CompletableFuture源码三部曲的最后一篇文章,梳理下思路如下:

  • 所有的都完成了才返回结果是构建了一个andTree
  • 有任一结果完成就算完成,是构建了一个orTree

标签:返回,JDK,结果,allOf,源码,CompletableFuture,cfs
From: https://blog.51cto.com/u_11970680/5959993

相关文章

  • Spring提取@Transactional事务注解的源码解析
    Spring提取@Transactional事务注解的源码解析声明:本文是自己在学习​​spring​​注解事务处理源代码时所留下的笔记;难免有错误,敬请读者谅解!!!1、事务注解标签<tx:annotatio......
  • ConcurrentHashMap源码解析(JDK8)
    并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能......
  • 大型三甲医院HIS系统源码 县乡一体医院管理系统源码 门诊住院医嘱药房药库发药管理系
    his系统源码,适用在县乡一体化,医联体分级诊疗项目上,​​本源码开发语言asp.net​​c#,数据库sqlserver2012,开发工具vs2015。技术框架mvc、ef等HIS英文全称hospitalinformat......
  • 微信小程序商城源码开发流程|商城小程序源代码完整版
     什么是微信小程序商城源码? 微信小程序商城源码用于商家发布商品,买家购买商品,跟踪微信商城商家和其他零售商的包裹等一系列网上购物问题。微信小程序商城依靠微信的广大......
  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCla......
  • forms组件渲染标签 、forms组件展示信息 、forms组件校验补充、 forms组件参数补充 、
    目录forms组件渲染标签forms组件展示信息forms组件校验补充forms组件参数补充forms组件源码剖析modelform组件django中间件forms组件渲染标签<p>forms组件渲染标签的方式......
  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCl......
  • 微服务-环形熔断器设计与gobreaker源码分析
    环形熔断器本文主要是阅读微软在早些年前发表的环形熔断器的设计的文章,CircuitBreakerPattern。该文比较详细的介绍了环形熔断器设计的背景,及解决的问题。环形熔断器设......
  • JDK的下载与安装配置
    一、下载JDK 在 Oracle官网下载符合操作系统版本的JDK 1、选择相对应的系统版本,我这里选择使用安装包的方式 2、双击打开下载好的msi文件,进行安装 3、选择......
  • cartographer 源码解析(六)
    这一章节呢,主要讲外推器。我们上一章节说到激光的畸变与矫正,最关键的是什么呢?其实最关键的就是关于每个发射点的发射位置的估计推测,这里就用到了外推器去推测每个发射点的位......