一个非常简单的代码片段,如下所示:

String[] list = {"a", "b", "c"};
List<CompletableFuture<String>> completableFutureList = new ArrayList<>();
for (String s : list) {
    completableFutureList.add(CompletableFuture.supplyAsync(() -> s)
            .thenApply(String::toUpperCase));
}
CompletableFuture<String>[] a = completableFutureList
        .toArray(new CompletableFuture[completableFutureList.size()]);
System.out.println(a.length);
CompletableFuture.allOf(a).whenComplete((r, e) -> {
    if (null != r) {
        System.out.println(r);
    } else {
        throw new RuntimeException(e);
    }
});


我希望程序应打印“ A B C”。但是实际上什么也没印出来。为什么以及如何解决?

最佳答案

引用CompletableFuture.allOf()方法的Javadoc(重点是我的):


  返回一个新的CompletableFuture,当所有
       给定的CompletableFutures完成。如果给定的任何
       CompletableFutures异常完成,然后返回
       CompletableFuture也这样做,CompletionException
       认为此异常是其原因。否则,结果,
       如果有的话,给定的CompletableFutures不会反映在
       返回的CompletableFuture,但可以通过
       逐一检查它们。如果没有CompletableFutures
       提供后,返回一个CompletableFuture并用以下值完成
       {@code null}。


因此,我认为您需要在a[0].get()回调中手动查询它们(例如,使用whenComplete())。像这样:

CompletableFuture.allOf(a).whenComplete((r, e) -> {
    for (CompletableFuture<String> future : a) {
        try {
           System.out.println(future.get());
        }
        catch (InterruptedException | ExecutionException e1) {
           e1.printStackTrace();
        }
    }
});

07-26 04:48