Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现CompletableFuture.allOf(),在任何期货失败时异常完成?_Java_Completable Future - Fatal编程技术网

Java 如何实现CompletableFuture.allOf(),在任何期货失败时异常完成?

Java 如何实现CompletableFuture.allOf(),在任何期货失败时异常完成?,java,completable-future,Java,Completable Future,我想实现CompletableFuture.allOf()和CompletableFuture.anyOf()的混合,其中返回的future在所有元素成功完成后立即成功完成,或者在任何元素异常完成后立即异常完成(具有相同的异常)。在多个元素失败的情况下,返回其中任何一个元素的异常就足够了 用例 我有一个任务需要聚合由CompletableFutures列表返回的子结果,但一旦其中任何一个失败,该任务就应该停止等待。我知道子任务将继续运行,这没关系 相关问题 我发现一开始似乎是一个重复的问题,但接

我想实现
CompletableFuture.allOf()
CompletableFuture.anyOf()
的混合,其中返回的future在所有元素成功完成后立即成功完成,或者在任何元素异常完成后立即异常完成(具有相同的异常)。在多个元素失败的情况下,返回其中任何一个元素的异常就足够了

用例 我有一个任务需要聚合由
CompletableFuture
s列表返回的子结果,但一旦其中任何一个失败,该任务就应该停止等待。我知道子任务将继续运行,这没关系

相关问题
我发现一开始似乎是一个重复的问题,但接受的答案使用了
CompletionService
,它需要
Callable
Runnable
作为输入。我正在寻找一种将已经运行的
CompletionStage
s作为输入的解决方案。

我相信这将完成以下工作:

/**
 * @param arrayOfFutures an array of futures to wait on
 * @return a {@code CompletableFuture} that completes successfully once all elements have completed successfully, or completes
 * exceptionally after any of the elements has done the same
 * <br>{@code @throws NullPointerException} if {@code arrayOfFutures} is null
 */
public CompletableFuture<Void> waitForAllButAbortOnFirstException(CompletableFuture<?>... arrayOfFutures)
{
    if (arrayOfFutures == null)
      return CompletableFuture.failedFuture(new NullPointerException("arrayOfFutures may not be null"));
    if (arrayOfFutures.length == 0)
        return CompletableFuture.completedFuture(null);
    return CompletableFuture.anyOf(arrayOfFutures).
        thenApply(unused ->
        {
            // Remove any futures that completed normally and try again
            return Arrays.stream(arrayOfFutures).
                filter(element -> !element.isDone() || element.isCompletedExceptionally()).
                toArray(CompletableFuture[]::new);
        }).
        thenCompose(remainingFutures -> waitForAllButAbortOnFirstException(remainingFutures));
}
/**
*@param arrayoffuture提供了一系列可供等待的未来
*@return一个{@code CompletableFuture},一旦所有元素成功完成,它就会成功完成,或者
*例外情况下,在任何元素完成相同操作之后
*
{@code@throws NullPointerException}如果{@code arrayOfFutures}为空 */ public CompletableFuture waitForAllButAbortOnFirstException(CompletableFuture…arrayOfFutures) { if(arrayOfFutures==null) 返回CompletableFuture.failedFuture(新的NullPointerException(“arrayOfFutures可能不为null”); if(arrayOfFutures.length==0) 返回CompletableFuture.completedFuture(空); 返回CompletableFuture.anyOf(arrayOfFutures)。 然后应用(未使用-> { //删除所有正常完成的期货,然后重试 返回Arrays.stream(arrayOfFutures)。 过滤器(element->!element.isDone()| | element.isCompletedExceptionally())。 toArray(CompletableFuture[]::新建); }). 然后撰写(remainingFutures->WaitForAllButtonFirstException(remainingFutures)); }
这个问题实际上与

虽然问题不完全相同,但相同的答案(来自我)应该能满足你的需求

您可以通过组合使用
allOf()
来实现这一点,并使用
excellective()
链接每个输入未来,这将使
allOf()
返回的未来立即失败:

CompletableFuture<String> a = …, b = …, c = …;
CompletableFuture<Void> allWithFailFast = CompletableFuture.allOf(a, b, c);
Stream.of(a, b, c)
    .forEach(f -> f.exceptionally(e -> {
        allWithFailFast.completeExceptionally(e);
        return null;
    }));
CompletableFuture a=…,b=…,c=…;
CompletableFuture allWithFailFast=CompletableFuture.allOf(a、b、c);
(a、b、c)流
.forEach(f->f.forEach(e->{
除(e)外,所有故障均快速完成;
返回null;
}));

我看到,即使其中一个失败(比如我们的示例中的一个),其他两个仍然由executor服务接收。标记为失败的任务是否不会自动从线程池中删除?对于真正的fail fast u,必须取消
f中的每个任务。例外情况下
确实,
CompletableFuture
不提供任何机制来取消其背后的任务。这是因为它不包含对该任务的引用,实际上可能没有这样的具体任务,因为您可以通过编程方式创建一个
CompletableFuture