一个非常简单的代码片段,如下所示:
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”。但是实际上什么也没印出来。为什么以及如何解决?
答案 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();
}
}
});