为了学习Java 8,我正在尝试下面的代码。
这个代码的输出是:
Before Get
Rajeev , Welcome to the CalliCoder Blog
After Get.但根据我对异步程序的理解,输出应该是
,类似于:
Before Get
After Get.
Rajeev , Welcome to the CalliCoder Blog对此有任何意见。
public static void main(String[] args) throws InterruptedException, ExecutionException {
CompletableFuture<String> welcomeText = CompletableFuture.supplyAsync(() -> {
for(double i=0;i<1000000000;i++) {
for(double j=0;i<1000000000;i++) {
for(double k=0;i<1000000000;i++) {
for(double l=0;i<1000000000;i++) {
for(double m=0;i<1000000000;i++) {
for(double n=0;i<1000000000;i++) {
for(double o=0;i<1000000000;i++) {
}
}
}
}
}
}
}
return "Rajeev";
}).thenApply(name -> {
return "Hello " + name;
}).thenApply(greeting -> {
return greeting + ", Welcome to the CalliCoder Blog";
});
System.out.println("Before Get");
System.out.println(welcomeText.get());
System.out.println("After Get");
}发布于 2018-03-27 06:32:10
对welcomeText.get()的调用会阻塞,直到结果可用为止。
异步编程并不意味着事情按随机顺序发生,而且它是好的。您必须有一个从异步执行中获益的任务。这个例子与任何事情都没有关系。
发布于 2018-03-28 14:11:30
如果我们正在学习异步编程,那么对.get()的调用是正确的。
在大多数异步场景中,您实际上不需要使用.get(),通常使用whenComplete()
类似于:
.whenComplete((s,e) -> {System.out.println("Really Done -> " + s );});注释掉get()并在main()中放置一个main(),通常异步是关于异步IO的,而CPU密集的操作实际上并不需要异步。如果您在java中签出netty和其他异步库,您会更欣赏这一点。
https://stackoverflow.com/questions/49505770
复制相似问题