CompletableFuture.anyOf - 所用语言需要帮助

时间:2018-03-27 16:10:37

标签: java-8 completable-future

我需要对CompletableFuture中anyOf javadoc中使用的文献提供一些帮助。

  

static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)   返回一个新的CompletableFuture,它在任何给定的CompletableFutures完成时完成,结果相同。

这个&#39;相同的结果&#39;意思?是什么?与CompletableFuture相同数组中的任何其他未来相同?

由于 Venkatesh Laguduva

2 个答案:

答案 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;