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

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


之前一篇文章我们从源码说了CompletableFuture的链式调用原理 《JDK源码之CompletableFuture(二)链式调用原理》,其实CompletableFuture除了链式调用之外呢,还有 全选或者任何一个选中的返回处理,这个是怎么实现的呢?

一、全部返回才返回

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

CompletableFuture.allOf(integerCompletableFuture2,integerCompletableFuture);

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

1
2
3
4
5
6
  • 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的任务中,有任何一个返回了结果,就可以把结果返回回来了,它的实现思路也很明确,画图表示如下:

1
2
3
4
5
6
7

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

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

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

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

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

  • 所有的都完成了才返回结果是构建了一个andTree
  • 有任一结果完成就算完成,是构建了一个orTree
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值