我需要对CompletableFuture中anyOf javadoc中使用的文献提供一些帮助。
static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)
返回一个新的CompletableFuture,它在任何给定的CompletableFutures完成时完成,结果相同。
这个&#39;相同的结果&#39;意思?是什么?与CompletableFuture相同数组中的任何其他未来相同?
由于 Venkatesh Laguduva
答案 0 :(得分:2)
与CompletableFuture相同数组中的任何其他未来相同?
确实
只要完成数组var-args的任何CompletableFutures
,该方法就会返回一个具有相同结果的新CompletableFuture
对象。
如果您查看实施情况,可以进行确认。
public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs) {
return orTree(cfs, 0, cfs.length - 1);
}
调用orTree()
:
static CompletableFuture<Object> orTree(CompletableFuture<?>[] cfs,
int lo, int hi) {
CompletableFuture<Object> d = new CompletableFuture<Object>();
if (lo <= hi) {
CompletableFuture<?> a, b;
int mid = (lo + hi) >>> 1;
if ((a = (lo == mid ? cfs[lo] :
orTree(cfs, lo, mid))) == null ||
(b = (lo == hi ? a : (hi == mid+1) ? cfs[hi] :
orTree(cfs, mid+1, hi))) == null)
throw new NullPointerException();
if (!d.orRelay(a, b)) {
OrRelay<?,?> c = new OrRelay<>(d, a, b);
a.orpush(b, c);
c.tryFire(SYNC);
}
}
return d;
}
答案 1 :(得分:2)
当它说出相同的结果时,它意味着与第一个完成的未来相同的结果。
如果你使用类似的东西:
CompletableFuture<String> stringFuture = CompletableFuture.supplyAsync(() -> {
Thread.sleep(3000); // handle exc
return "String";
});
CompletableFuture<Integer> intFuture = CompletableFuture.supplyAsync(() -> {
Thread.sleep(4000); // handle exc
return 1;
});
结果将与第一个完成的未来相同,如果字符串首先完成,则对象将具有该未来值的字符串类型,依此类推。
在这种情况下:
CompletableFuture.anyOf(stringFuture, intFuture).get()
会返回"string"
,因为它首先完成,如果intFuture
首先完成它将返回1
;