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()
,而不是之前。
我在 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()
,而不是之前。