Asynchronous UUID.randomUUID()的可完成未来问题
因此,我决定开始在Java8中使用CompletableFuture,但我无法找出这段代码的错误:Asynchronous UUID.randomUUID()的可完成未来问题,asynchronous,java-8,uuid,completable-future,Asynchronous,Java 8,Uuid,Completable Future,因此,我决定开始在Java8中使用CompletableFuture,但我无法找出这段代码的错误: public static void main(String...strings) throws Exception { final Supplier<User> makeUserSupplier = () -> makeUser(); final Supplier<String> uuidSupplier = () -> makeUUID()
public static void main(String...strings) throws Exception {
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;
});
}
private static User makeUser() throws RuntimeException {
// throw new RuntimeException("lkj");
return new User(1L, "mm", "ll", "kk");
}
private static String makeUUID() throws RuntimeException {
return UUID.randomUUID().toString();
// return "dummy";
}
我的行为是:
当我使用UUID.randomuid.toString时,控制台中不会打印任何内容,当我使用一些随机字符串时,会得到结果。
调试时我能到达的最后一个断点是我加入futureUUID最终字符串uuid=futureUUID.join时的行;然后我的程序停止,没有结果。
有人能解释一下为什么我在使用UUID时会有这种奇怪的行为吗
PS:我刚开始学习CompletableFuture,并思考平行期货,然后意外地想到了这一点
致以最诚挚的问候。这与UUID无关,只是UUID的生成需要一些时间,您不必等待完成 由于所有操作都发生在后台线程中,并且您从主方法返回,因此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错误的影响,因为工作线程中不需要join调用。这与UUID无关,只是它的生成需要一些时间,并且您不需要等待完成 由于所有操作都发生在后台线程中,并且您从主方法返回,因此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错误的影响,因为工作线程中不需要连接调用。Try CompletableFuture all=CompletableFuture.allOf。。。;全部加入;它返回一个空值,就像我的代码片段一样,我想得到所有这些的结果。什么是返回空值?CompleteableFuture::allOf返回CompleteableFuture。是的,我知道,但是all.join绝对是一个void.CompleteableFuture.allOf.thenApplyAsyncv->test.join返回字符串。例如,尝试CompleteableFuture all=CompleteableFuture.allOf。。。;全部加入;它返回一个空值,就像我的代码片段一样,我想得到所有这些的结果。什么是返回空值?CompleteableFuture::allOf返回CompleteableFuture。是的,我知道,但是all.join绝对是一个void。CompleteableFuture.allOf.thenApplyAsyncv->test.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