我有一个类似于
的代码public void myMethod(){
List<CompletableFuture<Void>> futures = new ArrayList<>();
//getQuestion, getAnswer, both returns a CompletableFuture<Void>
futures.add(getQuestion());
futures.add(getAnswer());
// make sure all the futures are executed.
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
}
答案 0 :(得分:2)
测试数组的大小没有意义。在Java中,数组永远不会更改其大小,这也适用于futures.toArray(…)
返回的数组。如果数组大小错误,则表明特定集合的toArray
实现已经返回了大小错误的数组。
您可以通过使用futures.toArray(new CompletableFuture[0]))
使代码更健壮,让toArray
实现创建一个大小合适的数组,而不是传递预大小的数组。正如this article中所述,实际上,它甚至更快,与古老的神话相反。
当然,对于固定数量的期货,根本不需要在集合和数组之间进行转换。您可以使用
public void myMethod() {
CompletableFuture<?>[] futures = { getQuestion(), getAnswer() };
// make sure all the futures are executed.
CompletableFuture.allOf(futures).join();
}
CompletableFuture.allOf
的合同将返回将在所有期货均完成后完成的期货,join()
将无条件等待该完成。没有什么需要检查的。如果将来有任何异常完成,则join()
方法将引发异常,要么是将CompletionException
作为原始异常的原因,要么是CancellationException
,当异常完成是由取消引起的。
答案 1 :(得分:0)
您可以将方法分为两部分:
public void myMethod(){
List<CompletableFuture<Void>> futures = constructFutures();
// make sure all the futures are executed.
CompletableFuture
.allOf(futures.toArray(new CompletableFuture[futures.size()]))
.join();
}
List<CompletableFuture<Void>> constructFutures() {
List<CompletableFuture<Void>> futures = new ArrayList<>();
//getQuestion, getAnswer, both returns a CompletableFuture<Void>
futures.add(getQuestion());
futures.add(getAnswer());
return futures;
}
并为constructFutures()
添加测试。