Rumah > Soal Jawab > teks badan
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?
某草草2017-06-15 09:24:15
Lihat javadoc CompletableFuture.supplyAsync
:
Mengembalikan CompletableFuture baharu yang diselesaikan secara tak segerak oleh tugasan yang dijalankan dalam
ForkJoinPool.commonPool()
dengan nilai yang diperoleh dengan menghubungi Pembekal yang diberikan.
Dan javadoc ForkJoinPool.commonPool()
:
.Mengembalikan contoh kumpulan biasa ini dibina secara statik; keadaan lariannya tidak terjejas oleh percubaan untuk menutup atau menutupSekarang Walau bagaimanapun kumpulan ini dan sebarang pemprosesan yang sedang ditamatkan secara automatik selepas program
System.exit
. Any program that relies on asynchronous task processing to complete before program termination should invokecommonPool().awaitQuiescence
, sebelum keluar.
Jika anda meletakkan yang terakhir sleep
改成ForkJoinPool.commonPool().awaitQuiescence(2, TimeUnit.SECONDS);
, anda juga boleh mencapai hasil yang anda harapkan
某草草2017-06-15 09:24:15
Cari untuk: benang daemon
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
defaultForkJoinWorkerThreadFactory = new DefaultForkJoinWorkerThreadFactory();
Lihat pelaksanaannya dan cipta daemon setiap masa. Mengenai mengapa benang utama mesti tidur, ia mudah difahami.