Thread Pool adalah alat praktis untuk mengumpulkan tugas secara paralel. Dengan diperkenalkannya arsitektur multi-core yang cocok untuk paralelisasi aplikasi, peran kumpulan utas menjadi semakin jelas. Melalui kelas ThreadPoolExecutor dan kelas tambahan lainnya, Java 5 memperkenalkan kerangka kerja ini sebagai bagian dukungan konkurensi baru.
Kerangka kerja ThreadPoolExecutor fleksibel dan kuat. Ini mendukung konfigurasi khusus pengguna dan menyediakan kait yang relevan dan kebijakan saturasi untuk menangani antrian penuh.
Kumpulan utas Java akan menempatkan tugas yang dikirimkan terlebih dahulu dalam antrian kerja dan mendapatkannya dari antrian kerja (Synchronousqueue diserahkan langsung oleh produser ke utas kerja). Lalu ada dua strategi implementasi untuk antrian kerja: antrian tak terbatas dan antrian terikat. Tidak ada masalah dengan saturasi dalam antrian yang tidak terikat, tetapi masalahnya adalah bahwa ketika permintaan terus menjadi tinggi, tugas akan ditambahkan ke antrian kerja tanpa otak, yang dapat menyebabkan memori dan sumber daya lain meluap atau knalpot. Antrian terikat tidak akan menyebabkan kelelahan memori yang disebabkan oleh beban tinggi, tetapi ada masalah bagaimana mengelola tugas yang baru diajukan ketika antrian kerja penuh. Ini adalah masalah yang perlu dipecahkan oleh strategi saturasi antrian kerja kumpulan.
Strategi kejenuhan dibagi menjadi: strategi aborsi, strategi Callerruns, buang strategi, dan strategi buangan.
Untuk pemahaman yang lebih baik, saya menulis contoh kecil.
Paket concurrency.pool; impor java.util.concurrent.linkedblockingdequ; impor java.util.concurrent.RECTEDExecutionHandler; Pool* Pool* Pool* wafen* Di bawah kebijakan saturasi yang berbeda* @param Handler Thread Pool Pekerjaan Kebijakan Saturasi Antrian*/Kebijakan Void Statis Public (RejectExecutionHandler Handler) {// Ada 2 utas dasar, jumlah maksimum utas adalah 3, dan kapasitas antrian kerja adalah 5. ThreadPoolExecutor Exec = New ThreadPoolExecutor (2.3.3.0l. LinkedBlockingDeque <> (5)); if (handler! = Null) {exec.setRectedExecutionHandler (handler); // atur kebijakan saturasi} untuk (int i = 0; i <10; i ++) {exec.submit (Tugas baru ()); // Kirim Tugas} {Exec.submit (Tugas baru ()); // Kirim Tugas} {EXECDOMID (); ThreadPoolExecutor.AbortPolicy ()); // Kebijakan ((ThreadPoolExecutor.CallerRunSpolicy ())); // Kebijakan baru (PRIBUKSICOR.DISCARDPOLICY (); 0; // Tugas Tugas Tugas Publik () {id = ++ count;}@override public void run () {coba {timeunit.seconds.sleep (3); // tidur selama 3 detik} catch (interrupted exception e) {System.err.println ("Thread diseling" Thread: " + thread.currentThread (). getName () +" Eksekusi selesai ");}}} Ketika antrian kerja penuh, strategi yang berbeda ditangani sebagai berikut:
1.abort Policy: Kebijakan default. Ketika tugas baru diajukan, pengecualian yang tidak dicentang dilemparkan langsung. Pengecualian dapat ditangkap oleh penelepon.
Tambahkan kode berikut ke fungsi utama:
Kebijakan (ThreadPoolExecutor.AbortPolicy ());
Hasil operasinya adalah:
Program ini melempar ExedExecutionException, dan total 8 tugas dijalankan (kumpulan utas dapat menjalankan 3 tugas di awal, dan 5 antrian disimpan dalam antrian kerja). Ketika antrian kerja penuh, pengecualian dilemparkan langsung, dan JVM tidak keluar (saya tidak tahu mengapa sekarang). Kita dapat melihat bahwa semua utas yang menjalankan tugas adalah utas di kumpulan utas.
2. Strategi Callerruns: Untuk mekanisme penyesuaian, baik tidak meninggalkan tugas atau melemparkan pengecualian, tetapi kembali ke penelepon. Tugas baru tidak dieksekusi di kumpulan utas, tetapi di utas yang memanggil eksektor.
Jalankan dalam fungsi utama:
Kebijakan ((ThreadPoolExecutor.CallerRunSpolicy ()));
Hasil berjalan
Semua tugas dijalankan, dan 2 (10 - 3 -5) tugas berhasil dieksekusi di utas utama, dan 8 tugas dieksekusi oleh utas di kumpulan utas.
3. Strategi Discard: Tugas yang baru diajukan ditinggalkan.
Jalankan dalam fungsi utama
Kebijakan (ThreadPoolExecutor.DiscardPolicy ());
Hasil di atas menunjukkan bahwa tidak ada pengecualian yang dilemparkan, 2 tugas baru yang diajukan kemudian dibuang, dan hanya 8 (3+5) tugas pertama yang diproses, dan JVM keluar.
4. Strategi Terbaik: Antrian adalah tugas "Kepala Tim" dan kemudian mencoba mengirimkan tugas baru. (Tidak cocok untuk skenario antrian kerja sebagai antrian prioritas)
Jalankan metode berikut di fungsi utama
Kebijakan (ThreadPoolExecutor.DiscardoldestPolicy ());
Hasil Menjalankan: Ada 8 tugas berjalan secara total. Program berakhir. Tugas yang ditambahkan kemudian adalah 9 dan 10, sedangkan tugas sebelumnya 3 dan 4 dibuang.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang contoh kode strategi saturasi antrian antrian Java Thread. Saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini.