这与UUID无关,只是它的生成需要一些时间,而您不需要等待完成。
因为所有操作都发生在后台线程中,而您将从
main
方法,jvm将确定不再运行任何非守护进程线程并终止。
只需添加等待完成操作:
final Supplier<User> makeUserSupplier = () -> makeUser();
final Supplier<String> uuidSupplier = () -> makeUUID();
final CompletableFuture<User> futureUser = CompletableFuture.supplyAsync(makeUserSupplier);
final CompletableFuture<String> futureUUID = CompletableFuture.supplyAsync(uuidSupplier);
CompletableFuture.allOf(futureUser, futureUUID)
.thenApplyAsync(aVoid -> {
final User user = futureUser.join();
final String uuid = futureUUID.join();
return "received user + " + user + " and uuid is " + uuid ;
})
.handle((ok, e) -> {
System.out.println("ok----" + ok);
System.out.println("e----" + e);
return null;
})
.join(); // wait for completion
请注意,在原始代码中,
.allOf(futureUser, futureUser)
而不是
.allOf(futureUser, futureUUID)
,因此当
futureUUID
尚未完成,这可能导致工作线程在
futureUUID.join()
打电话。
如果您使用
final CompletableFuture<User> futureUser = CompletableFuture.supplyAsync(() -> makeUser());
final CompletableFuture<String> futureUUID = CompletableFuture.supplyAsync(() -> makeUUID());
futureUser.thenCombineAsync(futureUUID, (user, uuid) -> {
return "received user + " + user + " and uuid is " + uuid;
})
.handle((ok, e) -> {
System.out.println("ok----" + ok);
System.out.println("e----" + e);
return null;
})
.join(); // wait for completion
也不受以下错误的影响
allOf
,因为没有
join()
工作线程中需要调用。