加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么Java 8 CompletableFuture thenCompose会根据完成顺序生成

发布时间:2020-12-15 03:08:14 所属栏目:Java 来源:网络整理
导读:我遇到过 Java 8 CompletableFuture thenCompose方法的奇怪行为.我有两个测试,仅在执行顺序上有所不同.两个测试都模拟thenCompose中生成的CompletableFuture中的失败. @Testpublic void completedAfter() { CompletableFutureString future1 = new Completab
我遇到过 Java 8 CompletableFuture thenCompose方法的奇怪行为.我有两个测试,仅在执行顺序上有所不同.两个测试都模拟thenCompose中生成的CompletableFuture中的失败.
@Test
public void completedAfter() {
    CompletableFuture<String> future1 = new CompletableFuture<>();
    CompletableFuture<String> future2 = new CompletableFuture<>();

    future1.thenCompose(x -> future2).whenComplete((r,e) -> System.out.println("After: " + e));

    future1.complete("value");
    future2.completeExceptionally(new RuntimeException());
}

@Test
public void completedBefore() {
    CompletableFuture<String> future1 = new CompletableFuture<>();
    CompletableFuture<String> future2 = new CompletableFuture<>();

    future1.complete("value");
    future2.completeExceptionally(new RuntimeException());

    future1.thenCompose(x -> future2).whenComplete((r,e) -> System.out.println("Before: " +e));
}

输出是:

After: java.util.concurrent.CompletionException: java.lang.RuntimeException
Before: java.lang.RuntimeException

问题是,为什么在一个案例中包含在CompletionException中但在另一个案例中却没有包含异常?

更新:Here是相关的错误报告.它已被标记并解析为JDK中的错误.

解决方法

好像是jdk库中的一个bug.

在“After”的情况下,.thenCompose将一个ThenCopy完成节点添加到目标future,后者的执行稍后由.completeExceptionally触发.完成节点的run方法在将来找到异常,并在目标上调用.internalComplete,它将所有异常包装到CompletionException中.
请参阅here节点的创建方式,以及here封装发生的位置.

现在,在Before案例中,代码路径完全不同.因为未来已经完成,所以.thenCompose不会创建额外的节点,而是立即返回invokes,并简单地返回一个(已经完成的第二个未来),然后在其上调用.whenComplete,再次,它无需创建一个新的完成节点,但只是立即invokes the callback,给它第二个未来的原始例外.

男孩,看着这段代码,有很多例子我想向学生展示他们应该做的事情……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读