【发布时间】:2018-06-17 03:14:14
【问题描述】:
我想跳过基于特定条件的可完成期货链。我尝试了chaining several completionstage 提出的解决方案,但它似乎不起作用。代码如下:
@RunWith(JUnit4.class)
public class ExceptionHandlingTests {
@Test
public void test1() {
CompletableFuture<Integer> result = new CompletableFuture<>();
CompletableFuture.runAsync(() -> {
System.out.println("Completing result1. Result: " + result.isDone());
result.complete(10);
}).thenCompose(x -> {
System.out.println("Completing result2. Result: " + result.isDone());
result.complete(10);
return CompletableFuture.completedFuture(5);
}).thenCompose(x -> {
System.out.println("Completing result3. Result: " + result.isDone());
result.complete(10);
return CompletableFuture.completedFuture(5);
}).applyToEither(result, Function.identity());
}
}
输出:
Completing result1. Result: false
Completing result2. Result: true
Completing result3. Result: true
即使“结果”completablefuture 被标记为已完成,后续的 completablefuture 仍会执行。如何跳过 Completablefuture 2 和 3?
【问题讨论】:
-
您为什么希望它们被跳过?这些阶段与
result完全无关。 -
我认为这就是 applyToEither 基于早期堆栈溢出问题所做的。我在描述中提供了链接。在这种情况下,有没有办法跳过其余的可完成期货?
-
在链接的答案中,有两个期货,只有一个会完成。由于另一个从未完成,因此不会评估其相关阶段。
applyToEither的属性就是不等待对方。但仅applyToEither不足以阻止对阶段的评估。