Asynchronous UUID.randomUUID()的可完成未来问题

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()

因此,我决定开始在Java8中使用CompletableFuture,但我无法找出这段代码的错误:

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