JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?
⽬录
之前⼀篇⽂章我们从源码说了CompletableFuture的链式调⽤原理 ,其实CompletableFuture除了链式调⽤之外呢,还有 全选或者任何⼀个选中的返回处理,这个是怎么实现的呢?
⼀、全部返回才返回
就是要等到所有结果都返回之后,才能把最后结果返回,使⽤⽰例如下:
CompletableFuture.allOf(integerCompletableFuture2,integerCompletableFuture);
上⾯⼀篇链式调⽤原理我们说了怎么⼀个future依赖上⼀个future的结果,⽽这个全部返回等待,也是⼀样的原理。
jdk怎么使用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的任务中,有任何⼀个返回了结果,就可以把结果返回回来了,它的实现思路也很明确,画图表⽰如下:
将最终返回的future放⼊所有任务的stack属性中,这样任何⼀个CompletableFuture触发了postComplete()⽅法就会触发最终future的⽅法。
四、任⼀返回就返回的源码
public static CompletableFuture<Object>anyOf(CompletableFuture<?>... cfs){
return orTree(cfs,0, cfs.length -1);
}
可以看到其构建了⼀个orTree,原理就是与我们上图说的⼀致。
这篇⽂章是我解读CompletableFuture源码三部曲的最后⼀篇⽂章,梳理下思路如下:
所有的都完成了才返回结果是构建了⼀个andTree
有任⼀结果完成就算完成,是构建了⼀个orTree

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。