CompletableFuture,运行 "join" 之后的异步代码

CompletableFuture, run asynchronous code after "join"

我在 Javascript/Typescript 一个月后遇到了一些麻烦。

例如,让我们看一下这个片段:

@Test
    public void testAsync(){
        CompletableFuture.supplyAsync(()->{
            try{
                Thread.sleep(10000);
                System.out.println("After some seconds");
            }catch(InterruptedException exc){
                return "Fail";
            }
            return "Done";
        }).thenAccept(s->System.out.println(s)).join();

        System.out.println("should write before After some seconds statement");
    }

我期待 CompletableFuture 之前的最后一个 system.out.println 到 运行,但它正在等待 Future 的完成。

所以,我得到的是: “几秒钟后” “完毕” “应该在几秒后写之前”

我想要的: “应该写在几秒后的声明之前” “几秒钟后” “完成”

我怎样才能做到这一点?

将未来存储在变量中,打印语句,然后join()等待结果:

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(10000);
        System.out.println("After some seconds");
    } catch (InterruptedException exc) {
        return "Fail";
    }
    return "Done";
}).thenAccept(s -> System.out.println(s));
System.out.println("should write before After some seconds statement");
future.join();

至于解释,.join()方法的javadoc说:

Returns the result value when complete, or throws an (unchecked) exception if completed exceptionally

也就是说,如果你调用.join()链接到thenAccept(),这意味着你将首先等待supplyAsync()结束,然后thenAccept(),并且将通过 join().

等待这样的结果

因此,您将在所有操作完成后到达您的System.out.println("should write before After some seconds statement");

如果您的 objective 是在完成测试之前等待未来,那么您应该在主线程打印之后调用 join(),而不是之前。