Kata pengantar
Saya telah menulis beberapa artikel tentang implementasi panggilan asinkron menggunakan @Async, dan saya juga telah menerima umpan balik dari banyak sepatu anak -anak. Di antara mereka, sebagian besar masalah adalah tentang penggunaan masa depan dan kontrol waktu tunggu dari eksekusi asinkron. Jadi saya akan berbicara tentang penanganan dua masalah ini bersama -sama.
Jika Anda tidak tahu penggunaan anotasi @Async, Anda dapat memeriksa artikel sebelumnya, sebagai berikut:
Tentukan tugas asinkron
Pertama, pertama -tama kami menggunakan anotasi @Async untuk menentukan tugas asinkron. Metode ini mengembalikan tipe masa depan, sebagai berikut:
@Slf4j@componentpublic class Task {public static acak acak = acak baru (); @Async ("Taskexecutor") Masa Depan Publik <String> run () melempar Exception {long sleep = random.nextInt (10000); log.info ("Mulailah tugas, waktu untuk mengambil:" + tidur + "msils"); Thread.sleep (tidur); log.info ("Lengkapi tugas"); mengembalikan asyncresult baru <> ("tes"); }}Tips: Apa tipe masa depannya?
Masa Depan adalah antarmuka yang membatalkan hasil eksekusi dari tugas yang dapat di -runnable atau dapat dipanggil, memeriksa apakah kueri selesai, dan mendapatkan hasilnya. Jika perlu, Anda bisa mendapatkan hasil eksekusi melalui metode GET, yang memblokir sampai tugas mengembalikan hasilnya.
Definisi antarmuka adalah sebagai berikut:
antarmuka publik masa depan <v> {boolean cancel (boolean mayintruppifrunning); boolean iscancelled (); Boolean Isdone (); V get () melempar interruptedException, ExecutionException; V dapatkan (waktu lama, unit timeUnit) melempar interruptedException, ExecutionException, timeoutexception;}Itu menyatakan lima metode seperti ini:
Dengan kata lain, masa depan menyediakan tiga fungsi:
Eksekusi Tes dan Definisi Batas waktu
Setelah menyelesaikan definisi tugas asinkron yang mengembalikan masa depan, kami mencoba menerapkan tes unit untuk menggunakan masa depan ini untuk menyelesaikan pelaksanaan tugas, seperti:
@Slf4j@runwith (springjunit4classrunner.class) @springboottestpublic kelas applicationTests {@autowired tugas tugas pribadi; @Test public void test () melempar Exception {Future <String> futureresult = Task.run (); Hasil string = futureresult.get (5, timeunit.seconds); log.info (hasil); }}Dalam kode di atas, kami juga menentukan waktu batas waktu untuk utas untuk dieksekusi dalam metode GET. Dengan melaksanakan tes ini, kita dapat mengamati bahwa ketika waktu eksekusi melebihi 5 detik, pengecualian batas waktu akan dilemparkan ke sini. Utas eksekusi dapat dilepaskan kembali ke kumpulan utas karena batas waktu eksekusi, agar tidak memblokir dan menempati sumber daya.
Contoh Lengkap:
Pembaca dapat memilih dua repositori berikut untuk melihat proyek Bab4-1-4 sesuai dengan preferensi mereka:
Github: https://github.com/dyc87112/springboot-learning/
Gitee: https://gitee.com/diidispace/springboot-learning/
Unduh Lokal: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.