Java CompletableFuture如何返回第一个FALSE或等待所有操作完成后返回TRUE
我有一个有点奇怪的情况,似乎不允许这个钉子适合任何广泛建立的可完成的未来洞Java CompletableFuture如何返回第一个FALSE或等待所有操作完成后返回TRUE,java,completable-future,Java,Completable Future,我有一个有点奇怪的情况,似乎不允许这个钉子适合任何广泛建立的可完成的未来洞 在评估返回布尔值的主方法中,我希望允许异步完成对三个不同方法的调用。这三个方法中的每一个都可以返回TRUE或FALSE 如果其中任何一个返回FALSE,我希望计算去掉余数,只返回该FALSE值。关键是,它可以是三者中的任何一个,不一定是第一个 但最重要的是,我需要在实际返回TRUE之前等待评估,直到所有三个都返回TRUE。这一点至关重要 现在,我正在使用一个基本的&&链来进行此评估: public boolean e
- 在评估返回布尔值的主方法中,我希望允许异步完成对三个不同方法的调用。这三个方法中的每一个都可以返回TRUE或FALSE
- 如果其中任何一个返回FALSE,我希望计算去掉余数,只返回该FALSE值。关键是,它可以是三者中的任何一个,不一定是第一个
- 但最重要的是,我需要在实际返回TRUE之前等待评估,直到所有三个都返回TRUE。这一点至关重要
&&
链来进行此评估:
public boolean evaluateChecks() {
return checkOne().Join() && checkTwo().Join() && checkThree().Join();
}
然而,这仍然是按照特定的顺序进行的-如果checkThree()
是第一个返回假值的,它仍然必须等到前两个提供了它们的值之后才能进行计算,这是由于和&
失败的原因
现在这三个方法都返回CompletableFuture
,但我可以将它们恢复为正常方法,以便在计算它们的主方法中运行CompletableFuture
我已经看过了,但似乎没有一个能提供我所需要的功能。改编自Didier L的答案:
异常地
和异常地完成
,而是使用然后接受
来完成由allOf()
返回的可完成的未来
例如,保存未来,因为您将要对其进行连锁操作:
CompletableFuture<Boolean> a = checkOne(), b = checkTwo(), c = checkThree();
使用上面返回的CompletableFuture
,如果任何原始期货以false
完成,您现在可以更快地完成它
Stream.of(a, b, c).forEach(f -> f.thenAccept(result -> {
if (!result) {
allWithFailFast.complete(false);
}
}));
根据完成顺序及其结果,allOf
期货将首先完成,并产生期货评估结果,或者其中一个期货将返回false
,并导致allWithFailFast
以false
完成
Stream.of(a, b, c).forEach(f -> f.thenAccept(result -> {
if (!result) {
allWithFailFast.complete(false);
}
}));
如果多个期货完成且为false
,则仅第一次调用
allWithFailFast.complete(false);
将做任何事情,其他的基本上将被忽略。您是否考虑过倒计时闩锁
?由于项目的其他细节,我无法在此类中实现可运行
,也无法将此代码拆分为单独的类。如果不实现Runnable
,我还能实现CountDownLatch
吗?.Join()
?这是什么方法?您是否尝试过使用cancel()
而不是返回false?然后对取消事件执行一些操作?您是否也尝试过此任何(CompletableFuture…cfs)
?嗯。。。当我尝试在foreach中放置一个返回值时,会得到一个意外的返回值
。不完全确定如何返回早期的FALSE或最终的TRUE。或者我只是在最后返回allWithFailFast.join()
?@R.KåbisforEach
接受消费者。你不需要归还里面的任何东西。allWithFailFast.complete(false)
完成FailFast行为。总体方法抛出错误,因为它没有可报告的布尔值。没有显式返回任何内容。据我所知,我需要在方法末尾的Stream.of()
@R.Kåbis之后放置一个return allWithfailFast.join()
,这是什么方法?如果您需要返回一个CompletableFuture
,则返回allWithFailFast
,这是您应该使用的以获得最终结果。如果查看我的原始代码,则包含检查评估的evaluateChecks()
需要返回一个纯布尔值。而一个普通的布尔值正是远端代码所期望的。