【问题标题】:CompletableFuture.anyOf - Help required on the language usedCompletableFuture.anyOf - 所用语言的帮助
【发布时间】:2018-03-27 16:10:36
【问题描述】:

我需要一些关于 CompletableFuture 中 anyOf javadoc 中使用的文献的帮助。

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

“相同的结果”是什么意思?和什么一样?与同一个 CompletableFuture 数组中的任何其他未来相同吗?

谢谢 文卡特什·拉古杜瓦

【问题讨论】:

    标签: java-8 completable-future


    【解决方案1】:

    当它说相同的结果时,它意味着与第一个完成的未来相同的结果。

    如果你使用类似的东西:

    CompletableFuture<String> stringFuture = CompletableFuture.supplyAsync(() -> {
        Thread.sleep(3000); // handle exc
        return "String";
    });
    
    CompletableFuture<Integer> intFuture = CompletableFuture.supplyAsync(() -> {
        Thread.sleep(4000); // handle exc
        return 1;
    });
    

    结果将与第一个完成的future相同,如果字符串先完成,则对象将是带有该future值的字符串类型,依此类推。

    在这种情况下:

    CompletableFuture.anyOf(stringFuture, intFuture).get()
    

    会返回"string",因为它先完成,如果intFuture先完成,它将返回1

    【讨论】:

    • >>与第一个完成的未来相同的结果。明白了!错过了这条线;有什么方法可以让我们成功完成第一个未来?
    • 当你使用anyOf时,你会收到另一个CompletableFuture,如果你执行一个等待结果的操作,比如get(),你应该得到第一个未来的结果。 (在我使用get() 的示例中,您可以使用另一个提供的方法并处理异常)。
    • 但是如果你的意思是成功的没有任何可完成的期货有异常或失败你可以检查这个stackoverflow.com/questions/33913193/…
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多