CompletableFuture.supplyAsync() 在不修改传入值的情况下是否冗余

问题描述 投票:0回答:1

在学习并发编程课程时,我遇到了以下示例代码:

@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()
,以防不修改传入值。

java concurrency completable-future java.util.concurrent
1个回答
0
投票
乍一看,该调用似乎是多余的,但它可能是一个糟糕的尝试,试图确保

thenApply(this::slowIncrement)

 不会在当前线程上执行(如果 
future1
 已经完成,则会发生这种情况),或者与返回 
future1
 的调用(可能是当前线程或运行 
slowInit()
 的线程)。

正确的方法是使用

thenApplyAsync()

 代替:

CompletableFuture<Integer> thenCompose = future1.thenApplyAsync(this::slowIncrement);
    
© www.soinside.com 2019 - 2024. All rights reserved.