【问题标题】:java completablefuture.allOff with dependent argumentsjava completablefuture.allOff 与依赖参数
【发布时间】:2018-02-25 13:50:52
【问题描述】:

这段代码对CompletableFuture.allOf(...)的使用是否有效

CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> "f1");
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> "f2");
CompletableFuture<String> f3 = f1.thenCombineAsync(f2, (s1, s2) -> s1 + s2);
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2, f3);
all.join();

在 javadoc 中:

此方法的应用之一是等待完成一个集合 在继续一个程序之前独立的 CompletableFutures,如: CompletableFuture.allOf(c1, c2, c3).join();.

但是我的例子中的依赖参数呢?如果它不是有效的例子,会出现什么问题以及为什么?


更新:也许这对某人有帮助,这个故事以 jdk-8 中的 bug 结尾 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8200347#

【问题讨论】:

  • 你可以认为allOf 只是被阻止,直到所有通过的CompletableFutures 都完成。
  • @holi-java 所以,你是说它的有效用法?我之所以问这个问题,是因为我有更复杂的示例,有时 join 在 allOf 上被永久阻止,而传递给 allOf 的所有可完成期货都处于已完成状态。所以我试图不理解我对 allOf 的使用是否被允许并且它不是 jdk 文档中的直接答案
  • 如果您对allOf() 有疑问,您应该发布一个minimal reproducible example 来重现它。否则,“是的,它是有效的”答案将无济于事。
  • 您不太正确,因为我不确定是“allOf 问题”还是误用......文档对我来说不清楚

标签: java java-8 completable-future


【解决方案1】:

您传递给allOf()CompletableFutures 没有任何限制,但您有责任确保它们最终都完成。

这意味着例如您 complete() 是您使用 new 实例化的那些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多