Kata pengantar
Dalam seri tutorial Spring Boot sebelumnya, artikel "Menggunakan @Async untuk mengimplementasikan panggilan asinkron di Spring Boot" telah diperkenalkan cara menggunakan anotasi @Async untuk mengimplementasikan panggilan asinkron. Namun, kontrol atas eksekusi asinkron ini adalah keterampilan dasar kami dalam memastikan kesehatan aplikasi kami sendiri. Dalam artikel ini, mari kita pelajari jika kita mengontrol konkurensi panggilan asinkron melalui kumpulan utas khusus.
Kami dapat memodifikasi contoh dalam artikel ini berdasarkan contoh -contoh sebelumnya, atau membuat proyek Spring Boot baru untuk dicoba.
Tentukan kumpulan utas
Langkah pertama adalah mendefinisikan kumpulan utas di kelas utama Spring Boot, seperti:
@SpringbootApplicationPublic Class Application {public static void main (string [] args) {springApplication.run (application.class, args); } @EnableAsync @configuration class TaskPoolConfig {@bean ("Taskexecutor") Eksekutor publik Taskexecutor () {threadpooltaskexecutor Executor = new ThreadPooltaskExecutor (); Executor.setCorepoolSize (10); Executor.setMaxPoolSize (20); Executor.setqueuecapacity (200); Executor.setkeepaliveseconds (60); Executor.setThreadnameprefix ("Taskexecutor-"); executor.setRECTEDExecutionHandler (ThreadPoolExecutor.callerrunspolicy ()) baru; Return Executor; }}}Di atas kami membuat kumpulan utas dengan menggunakan threadpooltaskexecutor, dan mengatur parameter berikut:
Menggunakan kumpulan benang
Setelah mendefinisikan kumpulan utas, bagaimana kita membuat tugas -tugas eksekusi secara asinkron yang dijalankan menggunakan sumber daya di kumpulan utas ini? Metode ini sangat sederhana. Kita hanya perlu menentukan nama kumpulan utas di anotasi @Async, misalnya:
@Slf4j@componentpublic class Task {public static acak acak = acak baru (); @Async ("Taskexecutor") public void dotaskone () melempar Exception {log.info ("Mulai Tugas Satu"); Long Start = System.CurrentTimeMillis (); Thread.sleep (acak.nextint (10000)); long end = system.currentTimemillis (); log.info ("tugas lengkap satu, waktu diambil:" + (end - start) + "milidetik"); } @Async ("Taskexecutor") public void dotasktwo () melempar Exception {log.info ("Mulai Tugas 2"); Long Start = System.CurrentTimeMillis (); Thread.sleep (acak.nextint (10000)); long end = system.currentTimemillis (); log.info ("Tugas Lengkap 2, waktu diambil:" + (end - start) + "milidetik"); } @Async ("Taskexecutor") public void dotaskThree () melempar Exception {log.info ("Mulai tugas tiga"); Long Start = System.CurrentTimeMillis (); Thread.sleep (acak.nextint (10000)); long end = system.currentTimemillis (); log.info ("tugas lengkap tiga, memakan waktu:" + (end - start) + "milidetik"); }}Pengujian unit
Akhirnya, mari kita tulis tes unit untuk memverifikasinya
@Runwith (springjunit4classrunner.class) @springboottestpublic kelas applicationTests {@autowired tugas tugas pribadi; @Test public void test () melempar Exception {Task.DotaSkone (); task.dotaSktwo (); Task.dotaSaskThree (); Thread.currentThread (). Join (); }}Lakukan uji unit di atas, kita dapat melihat di konsol bahwa semua nama utas output diawali dengan kumpulan utas yang kami tetapkan sebelumnya, yang berarti bahwa percobaan kami menggunakan kumpulan utas untuk melakukan tugas asinkron telah berhasil!
2018-03-27 22: 01: 15.620 Info 73703 --- [TaskExecutor-1] com.didispace.async.task: Mulailah melakukan tugas satu
2018-03-27 22: 01: 15.620 Info 73703 --- [TaskExecutor-2] com.didispace.async.task: Mulai Tugas 2
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-3] com.didispace.async.task: Mulai tugas tiga
2018-03-27 22: 01: 18.165 Info 73703 --- [Taskexecutor-2] com.didispace.async.task: Tugas Lengkap 2, Waktu diambil: 2545 milidetik
2018-03-27 22: 01: 22.149 Info 73703 --- [Taskexecutor-3] com.didispace.async.task: Tugas lengkap tiga, waktu diambil: 6529 milidetik
2018-03-27 22: 01: 23.912 Info 73703 --- [TaskExecutor-1] com.didispace.async.task: Tugas lengkap satu, waktu diambil: 8292 milidetik
Contoh Lengkap:
Pembaca dapat memilih untuk melihat proyek Bab 4-1-3 sesuai 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.