我对以下代码不了解。它减少到最低限度,但是在javafx应用程序中运行时效果是相同的。
在public static void main(String[] args)
中运行时,控制台将打印A
并退出。在javafx应用程序中运行时,它将跳过该块。
在jshell
中运行时,控制台将按预期打印:A B1 B2 C Fin
。
如果我将_Async
与提供的Executor
一起使用,则完全相同。
如果我取消注释// join(),它的行为将符合预期。
void func() {
CompletableFuture.supplyAsync(() -> {
System.out.println("A");
return "A";
})
.thenAccept((a) -> {
try {
Thread.sleep(2 * 1000);
System.out.println("B1");
} catch (InterruptedException e) {
System.out.println("Interrupted B1");
e.printStackTrace();
}
})
.thenCombineAsync(CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2 * 1000);
System.out.println("B2");
} catch (Exception e) {
System.out.println("Interrupted B2");
e.printStackTrace();
}
return "B2";
}), (a, b) -> {
try {
Thread.sleep(2 * 1000);
System.out.println("C");
} catch (InterruptedException e) {
System.out.println("Interrupted C");
e.printStackTrace();
}
return "C";
})
.thenRunAsync(() -> {
System.out.println("Fin");
});//.join();
}