Java CompletableFuture anyOf N
Java CompletableFuture anyOf N
我正在寻找如何在 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;
}
returns N 结果为 List
,但顺序未定。只是返回 Set
会改变语义,即当多个期货评估结果相同时。
如果有足够多的成功完成,列表的长度将始终为 N。也将在第 N 个结果可用时完成,而不是等待其他期货。一旦失败的 future 太多以至于不再可能成功完成 N 个值,由此产生的 future 将异常完成。实际上,它将是失败期货的任意抛出。
我正在寻找如何在 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;
}
returns N 结果为 List
,但顺序未定。只是返回 Set
会改变语义,即当多个期货评估结果相同时。
如果有足够多的成功完成,列表的长度将始终为 N。也将在第 N 个结果可用时完成,而不是等待其他期货。一旦失败的 future 太多以至于不再可能成功完成 N 个值,由此产生的 future 将异常完成。实际上,它将是失败期货的任意抛出。