gpt4 book ai didi

Java CompletableFuture 任意 N

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:25 27 4
gpt4 key购买 nike

我正在寻找如何在 Java 中给定一个 Async CompletableFutures 列表,以便前 N 个中的任何一个成功完成或失败。除非没有 N 次成功,否则忽略任何失败。

有这方面的例子吗?

谢谢

最佳答案

也许,类似这样的事情?

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 会改变语义,即当多个 future 计算结果相等时。

如果有足够的成功完成,列表的长度将始终为 N。它也会在第 N 个结果出来时完成,而不是等待其他 future。一旦有太多失败的 future 以至于不再可能成功完成 N 个值,则最终的 future 将异常完成。实际上,它将是失败的 future 中的任意抛出。

关于Java CompletableFuture 任意 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833995/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com