JDK源码之CompletableFuture(一)结果返回原理JDK源码之CompletableFuture(二)链式调用原理
JDK源码之CompletableFuture(三)anyOf,allOf是怎么实现的?
目录
- 一、全部返回才返回
- 二、allOf源码
- 三、一个返回就返回
- 四、任一返回就返回的源码
之前一篇文章我们从源码说了CompletableFuture的链式调用原理
《JDK源码之CompletableFuture(二)链式调用原理》,其实CompletableFuture除了链式调用之外呢,还有
全选或者任何一个选中的返回处理,这个是怎么实现的呢?
一、全部返回才返回
就是要等到所有结果都返回之后,才能把最后结果返回,使用示例如下:
CompletableFuture.allOf(integerCompletableFuture2,integerCompletableFuture);
上面一篇链式调用原理我们说了怎么一个future依赖上一个future的结果,而这个全部返回等待,也是一样的原理。
- 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
标签:返回,JDK,结果,allOf,源码,CompletableFuture,cfs From: https://blog.51cto.com/u_11970680/5959993