CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("enter into completableFuture()");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("start to out of completableFuture()");
return "a";
});
System.out.println("do something else");
cf1.thenApply(v -> v + " b").thenAcceptAsync(v ->
System.out.println(v)
);
System.out.println("finalize...");
//注释最后一行,无法得到预期结果
//TimeUnit.SECONDS.sleep(10);
Hasilnya ialah:
do something else
enter into completableFuture()
finalize...
start to out of completableFuture()
a b
Jika anda mengulas baris terakhir kod di atas, anda tidak akan mendapat hasil yang diharapkan.
Mengapa kita mesti membiarkan program tidur selama 10 saat secara eksplisit?
Lihat javadoc
CompletableFuture.supplyAsync
:Dan javadoc
.ForkJoinPool.commonPool()
:Jika anda meletakkan yang terakhir
sleep
改成ForkJoinPool.commonPool().awaitQuiescence(2, TimeUnit.SECONDS);
, anda juga boleh mencapai hasil yang anda harapkanCari untuk: benang daemon
Lihat pelaksanaannya dan cipta daemon setiap masa. Mengenai mengapa benang utama mesti tidur, ia mudah difahami.JVM akan keluar apabila hanya benang daemon yang tinggal dalam benang Jika tidak, jika ada mana-mana benang pengguna, JVM tidak akan keluar.
Kami boleh meneka bahawa CompletableFuture.supplyAsync memulakan benang daemon Malah, CompletableFuture menggunakan ForkJoinPool secara dalaman secara dalaman