Rumah  >  Soal Jawab  >  teks badan

Masalah menggunakan CompletableFuture dalam JDK8

        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?

伊谢尔伦伊谢尔伦2683 hari yang lalu873

membalas semua(2)saya akan balas

  • 某草草

    某草草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 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

    balas
    0
  • 某草草

    某草草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.

    balas
    0
  • Batalbalas