Rumah  >  Soal Jawab  >  teks badan

异步编程 - 在Java中使用异步后,主方法如何返回异步中得到的值?

一个返回值为User的方法,在内部调用了异步方法(比如Rxjava,或者异步的网络请求),其内部匿名函数内才能拿到user对象,那么我的方法应该怎么return这个对象?

PHPzPHPz2717 hari yang lalu462

membalas semua(7)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-18 09:53:32

    Nilai pulangan kaedah ialah pengguna, jadi kaedah ini tidak boleh dipanggil kaedah tak segerak. Melainkan kaedah ini mengembalikan masa depan, atau sesuatu seperti rujukan yang boleh mendapatkan hasilnya kemudian, kaedah ini boleh dipanggil kaedah tak segerak. Jika anda ingin mendapatkan pengguna selepas melaraskan kaedah, maka tidak perlu meletakkan kod tak segerak dalam kaedah, yang tidak bermakna sama sekali.

    Hasil tak segerak hanya boleh dikembalikan melalui panggilan balik.

    Kaedah penyegerakan biasanya seperti ini

    public User syncGetUser() {
        User user = heavyWork();
        return user;
    }

    Memandangkan kaedah heavyWork mungkin perlu menyemak pangkalan data atau melakukan banyak pengiraan, kaedah heavyWork akan mengambil banyak masa untuk dilaksanakan.
    Jika anda tidak mahu menunggu lama, di sinilah asynchronous berguna.

    public Future<User> asyncGetUser() {
        Future<User> future = threadPool.submit(new Callable<User> {
            public User call() throws Exception {
                return heavyWork();
            }
        }
        
        return future;
    }

    Pada ketika ini, heavyWork telah diserahkan kepada rangkaian lain untuk dijalankan, dan masa depan dikembalikan kepada anda.
    Selepas itu, anda boleh mendapatkan pengguna yang anda inginkan melalui kaedah get masa hadapan ini.

    Ini adalah maksud dan kegunaan tak segerak. Tajuk itu sendiri bercanggah. Mengembalikan hasil pelaksanaan tak segerak dalam kaedah yang mengandungi kod tak segerak ialah percanggahan.

    balas
    0
  • 阿神

    阿神2017-04-18 09:53:32

    Saya tidak mempelajari RxJava, tetapi rakan sekerja saya yang melakukan pembangunan Android dalam pasukan sebelumnya berkata ia sangat berguna.

    Tingkat 1 memberikan penyelesaian menggunakan Future, tetapi malangnya Future ialah API penyekat tak segerak, iaitu tiada panggilan balik pemberitahuan.

    Bagi cara melaksanakan panggilan balik, ini sepatutnya sangat asas. Lihat sahaja corak pemerhati.

    Tetapi anda boleh menggunakan google guava, yang menyediakan Masa Depan yang dipertingkatkan dipanggil ListenableFuture.

    Contoh di tingkat 1 dipetik di sini dan diubah suai.

     class A implements FutureCallback{
            ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
            ListenableFuture futrue = service.submit(new Callable() {
                public User call() {
                    return heavyWork();
                }
            });
            Futures.addCallback(furtrue,this);
    
            public void onSuccess(User user) {
                //这个是回调执行的代码
            }
            public void onFailure(Throwable thrown) {
    
            }
        }

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:53:32

    "Pemulangan" kaedah tak segerak berlaku sebelum kod dilaksanakan. Kod belum dilaksanakan lagi, bagaimanakah hasilnya boleh dikembalikan?

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 09:53:32

    Saya rasa boleh juga menggunakan kaedah panggil balik

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:53:32

    Gunakan CountDownLatch untuk menukar operasi tak segerak kepada operasi segerak.

    selak CountDownLatch akhir = CountDownLatch(1) baharu

    Panggil kaedah tak segerak.

    Dalam hasil panggilan balik tak segerak,
    latch.countDown();
    Kemudian

    cuba {

    latch.await();
    

    } tangkapan (InterruptedException e) {

    }


    kembali data;

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:53:32

    Terdapat urutan dalam java yang mengembalikan antara muka Boleh Panggil

    balas
    0
  • 阿神

    阿神2017-04-18 09:53:32

    rx.java belum digunakan
    tetapi saya tahu kaedah dalam android, saya harap ia akan membantu anda.
    Menurut apa yang anda katakan, jika hasil pulangan tak segerak digunakan dalam kaedah utama, anda mesti mempertimbangkan komunikasi antara benang
    Iaitu, tulis pengendali dahulu, dan tulis kaedah untuk menerima data, dan laksanakan pelaksanaan yang dikehendaki apabila data datang kaedah
    dan kemudian hantar data kepada pengendali selepas sub-benang selesai.

    balas
    0
  • Batalbalas