首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java CompletableFuture anyOf N

Java CompletableFuture anyOf N
EN

Stack Overflow用户
提问于 2019-02-23 03:35:58
回答 1查看 191关注 0票数 1

我正在寻找如何在Java语言中给定一个异步CompletableFutures列表,让前N个中的任何一个成功完成或失败。除非没有N个成功,否则忽略所有失败。

有这样的例子吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 01:46:08

也许,就像这样?

代码语言:javascript
复制
public static <T> CompletableFuture<List<T>> firstSuccessful(
        List<CompletableFuture<T>> list, int n) {

    int maxFail = list.size() - n;
    if(maxFail < 0) throw new IllegalArgumentException();

    AtomicInteger fails = new AtomicInteger(0);
    List<T> rList = new ArrayList<>(n);

    CompletableFuture<List<T>> result = new CompletableFuture<>();

    BiConsumer<T,Throwable> c = (value,failure) -> {
        if(failure != null) {
            if(fails.incrementAndGet() > maxFail) result.completeExceptionally(failure);
        }
        else {
            if(!result.isDone()) {
                boolean commit;
                synchronized(rList) {
                    commit = rList.size() < n && rList.add(value) && rList.size() == n;
                }
                if(commit) result.complete(Collections.unmodifiableList(rList));
            }
        }
    };
    for(CompletableFuture<T> f: list) f.whenComplete(c);
    return result;
}

它以List的形式返回N个结果,尽管顺序不确定。只是返回一个Set会改变语义,也就是说,当多个未来的结果相等时。

如果有足够的成功完成,则列表的长度始终为N。它也将在第N个结果可用时完成,而不是等待其他未来。一旦有太多失败的期货,成功完成N个值不再可能,那么由此产生的未来将异常完成。实际上,它将是失败的期货的任意可抛出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54833995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档