Java CompletableFuture.allOf()找不到任何数组元素

时间:2019-01-25 12:06:17

标签: java printing apply future complete

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

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”。但是实际上什么也没印出来。为什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

引用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();
        }
    }
});