在并发编程课程中,我遇到了以下示例代码:
@Test
void promiseTestCompose2() throws Exception {
CompletableFuture<Integer> future1 = CompletableFuture
.supplyAsync(this::slowInit)
.thenApply(this::slowIncrement);
CompletableFuture<Integer> thenCompose = future1
.thenCompose(value -> CompletableFuture.supplyAsync(() -> value))
.thenApply(this::slowIncrement);
int result = thenCompose.get();
assertEquals(result, 3);
}
看起来在这部分中,
thenCompose()
子句是多余的:
CompletableFuture<Integer> thenCompose = future1
.thenCompose(value -> CompletableFuture.supplyAsync(() -> value))
.thenApply(this::slowIncrement);
如果我将其更改为
CompletableFuture<Integer> thenCompose = future1.thenApply(this::slowIncrement);
测试仍然通过。
所以我的问题是
.thenCompose(value -> CompletableFuture.supplyAsync(() -> value))
在这里确实是多余的还是我错过了什么?
我想了解是否可以删除
thenCompose()
,以防它不修改传入值。
thenApply(this::slowIncrement)
不会在当前线程上执行(如果
future1
已经完成,则会发生这种情况),或者与返回
future1
的调用(可能是当前线程或运行
slowInit()
的线程)。正确的方法是使用
thenApplyAsync()
代替:
CompletableFuture<Integer> thenCompose = future1.thenApplyAsync(this::slowIncrement);