Thread pool sebenarnya merupakan implementasi dari teknologi pooling. Ide inti dari teknologi pooling adalah untuk mewujudkan penggunaan kembali sumber daya dan menghindari overhead kinerja yang disebabkan oleh pembuatan dan penghancuran sumber daya yang berulang-ulang. Kumpulan thread dapat mengelola sekumpulan thread sehingga thread tersebut tidak akan dimusnahkan setelah menyelesaikan tugas, namun akan terus memproses tugas yang telah dikirimkan oleh thread lain.
Manfaat menggunakan kumpulan utas
Mengurangi konsumsi sumber daya. Kurangi biaya pembuatan dan penghancuran thread dengan menggunakan kembali thread yang dibuat.
Meningkatkan kecepatan respons. Ketika tugas tiba, tugas tersebut dapat langsung dijalankan tanpa menunggu thread dibuat.
Meningkatkan pengelolaan benang. Thread adalah sumber daya yang langka. Jika dibuat tanpa batasan, thread tidak hanya akan menghabiskan sumber daya sistem, tetapi juga mengurangi stabilitas sistem. Kumpulan thread dapat digunakan untuk alokasi, penyetelan, dan pemantauan terpadu.
Parameter konstruksi
corePoolSize: digunakan untuk bekerja di kumpulan threadJumlah thread inti。
UkuranKolammaksimum:Jumlah utas maksimum , jumlah maksimum thread yang diperbolehkan untuk dibuat oleh kumpulan thread. Ketika jumlah thread di kumpulan thread mencapai corePoolSize, jika antrian tugas penuh dan tugas baru perlu diproses, kumpulan thread akan membuat thread baru (tetapi jumlah totalnya tidak melebihi maksimumPoolSize) untuk memproses tugas-tugas ini. (Hal ini setara dengan ketika area antrian penuh, thread berikutnya dapat langsung melompat ke dalam antrian.) Jika jumlah tugas melebihi maksimumPoolSize dan antrian tugas penuh, kumpulan thread akan memproses tugas yang tidak dapat dijalankan ini sesuai dengan kebijakan penolakan.
keepAliveTime: Waktu kelangsungan thread yang dibuat setelah melebihi corePoolSize atau semua threadWaktu bertahan hidup maksimum, tergantung pada konfigurasinya.
unit:keepAliveTime lainnyasatuan waktu。
Antrean kerja:antrian tugas , adalah antrian pemblokiran. Ketika jumlah thread mencapai jumlah thread inti, tugas akan disimpan dalam antrian pemblokiran. Implementasi umum: Kelas implementasi antarmuka BlockingQueue, seperti ArrayBlockingQueue, LinkedBlockingQueue, dll.
threadFactory: digunakan untuk membuat thread di dalam kumpulan threadpabrik。
penanganan:Tolak kebijakan;Ketika antrian penuh dan jumlah thread mencapai jumlah thread maksimum, metode ini akan dipanggil untuk memproses tugas.
Cara mengatur parameter
1. Tentukan jumlah thread inti (corePoolSize)
Tugas intensif CPU: Untuk tugas intensif CPU, biasanya jumlah thread inti diatur antara 1 dan 2 kali jumlah inti CPU. Hal ini memastikan pemanfaatan penuh sumber daya CPU sambil menghindari peralihan konteks yang berlebihan.
Tugas intensif IO: Untuk tugas intensif IO, karena thread tidak menempati CPU saat menunggu operasi IO, lebih banyak thread inti dapat diatur. Secara umum, jumlah thread inti dapat diatur lebih dari 2 kali jumlah inti CPU sehingga lebih banyak tugas yang dapat diproses sambil menunggu IO.
Tugas campuran: Jika aplikasi Anda berisi tugas intensif CPU dan intensif IO, Anda perlu menyeimbangkan pengaturan jumlah thread inti berdasarkan situasi spesifik.
2. Tentukan jumlah thread maksimum (maximumPoolSize)
Lingkungan dengan sumber daya terbatas: Dalam lingkungan dengan sumber daya terbatas (seperti sistem tertanam atau server cloud), jumlah maksimum thread perlu dibatasi untuk mencegah terlalu banyak thread menggunakan sumber daya.
Sistem konkurensi tinggi: Untuk sistem yang perlu menangani sejumlah besar permintaan bersamaan, jumlah maksimum thread dapat ditingkatkan secara tepat untuk meningkatkan kemampuan pemrosesan bersamaan sistem. Namun, pengaturan jumlah maksimum thread harus dipertimbangkan secara komprehensif berdasarkan kapasitas beban dan kondisi sumber daya sistem.
3. Atur waktu idle thread (keepAliveTime)
Aplikasi intensif CPU: Untuk aplikasi intensif CPU, Anda biasanya dapat mengatur waktu idle thread ke nilai yang lebih pendek karena sumber daya CPU sangat berharga dan Anda tidak ingin terlalu banyak thread idle menghabiskan sumber daya. Dalam beberapa kasus, bahkan dapat diatur ke 0, yang menunjukkan bahwa thread non-inti tidak dipertahankan.
Aplikasi intensif IO: Untuk aplikasi intensif IO, karena thread tidak menggunakan sumber daya CPU saat menunggu operasi IO, waktu idle thread dapat diatur ke nilai yang lebih lama (misalnya lebih dari 1 menit) untuk menghindari seringnya startup dan penghancuran thread . overhead kinerja yang ditimbulkan.
4. Pilih antrian tugas (workQueue)
antrian berbatas : Menggunakan antrian terbatas dapat membatasi waktu tunggu tugas dalam antrian dan menghindari kelebihan memori karena terlalu banyak tugas. Namun, jika panjang antrian diatur terlalu kecil, tugas mungkin ditolak. (Umumnya memilih antrian berbatas)
Antrean tidak terbatas: Menggunakan antrian tidak terbatas dapat menyimpan semua tugas dalam cache sebanyak mungkin, namun Anda perlu memperhatikan masalah konsumsi memori. Jika antrean tak terbatas digunakan, parameter jumlah maksimum thread pada kumpulan thread mungkin menjadi tidak valid karena kumpulan thread tidak berupaya membuat thread baru untuk memproses tugas dalam antrean.
5. Konfigurasikan pabrik thread (threadFactory)
Pabrik benang digunakan untuk membuat benang baru. Dengan menyesuaikan pabrik thread, Anda dapat mengatur atribut seperti prioritas thread dan status thread daemon, dan Anda juga dapat mengatur nama thread yang bermakna untuk memfasilitasi diagnosis masalah di JVM.
6. Konfigurasikan kebijakan penolakan (handler)
Ketika kumpulan thread tidak dapat memproses tugas baru (yaitu, jumlah thread telah mencapai maksimumPoolSize dan antrian tugas penuh), kebijakan penolakan perlu dikonfigurasi untuk menangani tugas yang tidak dapat dijalankan ini.Strategi penolakan yang umum meliputiLemparkan pengecualian secara langsung、Gunakan thread pemanggil untuk menjalankan tugas、Abaikan tugas baru dan buang tugas terlama dalam antrean Tunggu. Anda juga dapat menyesuaikan kebijakan penolakan sesuai kebutuhan.