我有一个看起来类似于的代码

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();

}



在执行myMethod()*之后,我如何测试Futures数组的大小是否为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

07-24 19:05
查看更多