验证 completablefutures 列表的大小

Verify size of list of completablefutures

我有一个类似于

的代码
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();

}

您可以将方法一分为二:

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() 添加测试。

测试数组的大小没有意义。在 Java 中,数组永远不会改变它们的大小,这也适用于由 futures.toArray(…) 编辑的数组 return。如果数组的大小错误,则意味着特定集合的 toArray 实现已经 return 编辑了一个错误大小的数组。

您可以通过使用 futures.toArray(new CompletableFuture[0])) 使代码更健壮,让 toArray 实现创建一个大小合适的数组,而不是传入一个预设定大小的数组。正如 this article 中所解释的,它实际上更快,与旧神话相反。

当然,对于固定数量的futures,根本不需要在collection和array之间进行转换。你可以使用

public void myMethod() {
    CompletableFuture<?>[] futures = { getQuestion(), getAnswer() };

    // make sure all the futures are executed.
    CompletableFuture.allOf(futures).join();
}

CompletableFuture.allOf 的合约是 return 一个未来,当所有的期货都完成时,它就会完成,join() 将无条件地等待那个完成。没有什么需要检查的。如果任何 future 异常完成,join() 方法将抛出异常,要么是 CompletionException 以原始异常为原因,要么是 CancellationException 当异常完成是由取消引起的。