【发布时间】:2019-06-17 05:36:40
【问题描述】:
所以我有几个希望运行的未来,即使有些失败我希望所有人都有机会运行。所以如果我这样做:
CompletableFuture.allOf(futures).join()
会这样吗?我的理由是,每个未来都会在其执行程序中拥有自己的队列作业,因此只要主线程没有首先完成,所有的都会运行。我的问题是我在.allOf() 上专门.join() 所以我的应用程序在运行所有内容之前不会结束
所以allOf() 语义让我感到困惑:无论是否成功,当所有传递的期货都完成时,未来是否会返回完成?或者如果它看到一个失败而不等待其余的,它会完成一个失败的未来吗?
编辑
为了进一步说明我的问题,.allOf 的行为是这样的吗:
Stream.of(futures).forEach(future -> {
try {
future.join()
} catch (Throwable e) {
//dont throw, we want to join the rest
}
})
或者它的行为如下:
Stream.of(futures).forEach(future -> {
try {
future.join()
} catch (Throwable e) {
throw e; //All other remaining .join() wont run
}
})
它是什么?第一种还是第二种情况?因为我想要第一个案例,这就是我暂时在我的代码上使用的,但我想尽可能使用allOf(),因为它更美观
谢谢!
【问题讨论】:
-
来自doc: "此方法的应用之一是在继续程序之前等待一组独立的CompletableFutures完成,如:CompletableFuture.allOf(c1, c2, c3).join();." - 至于突然完成,也有记录。
-
@VinceEmigh 我认为问题是不同的,如果其中一个失败,并且您知道此时结果将是
CompletionException,那么所有其他可能尚未开始的仍然被执行?我的意思是假设他们支持中断,会发送中断吗? -
@VinceEmigh 我没有看到任何关于“突然完成”的信息,所以如果你能把它拼出来就好了。 @Eugene 是对的,还要补充他的隐喻,
allOf()会等到所有尚未执行的未来运行并完成(失败或其他)吗? -
值得注意的是,像
join()这样的东西不会使期货运行。未来对象所代表的异步操作已经在运行(或至少计划运行)——否则你一开始就不可能有未来。未来的操作可能会失败或被取消,但这与您等待它们的方式无关。 -
公平点@DanielPryden,我的目的不是让它们运行,而是等到所有完成,不管是失败还是成功,因为否则我的主线程将结束,让工作未完成。如果
allOf()会立即失败并继续说RuntimeException,那就太糟糕了。所以问题是:allOf()是否等到全部完成?
标签: java semantics completable-future