Masalah menggunakan CompletableFuture dalam JDK8
伊谢尔伦
伊谢尔伦 2017-06-15 09:22:15
0
2
930
        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?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(2)
某草草

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 invoke commonPool().awaitQuiescence, sebelum keluar.

.

Jika anda meletakkan yang terakhir sleep改成ForkJoinPool.commonPool().awaitQuiescence(2, TimeUnit.SECONDS);, anda juga boleh mencapai hasil yang anda harapkan

某草草

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan