Apa sebenarnya perbedaan antara ukuran kolam inti dan ukuran kolam maksimum saat kita membicarakannya ThreadPoolExecutor
?
Bisakah itu dijelaskan dengan bantuan contoh?
java
asynchronous
threadpoolexecutor
pengguna2568266
sumber
sumber
Jawaban:
Dari postingan blog ini :
sumber
allowCoreThreadTimeOut(boolean)
yang memungkinkan benang inti untuk dibunuh setelah diberikan waktu idle. Menyetel ini ke true dan setelancore threads
=max threads
memungkinkan kumpulan utas berskala antara 0 danmax threads
.JIKA menjalankan utas> corePoolSize & <maxPoolSize , maka buat Thread baru jika antrian tugas Total penuh dan yang baru tiba.
Formulir doc: (Jika ada lebih dari corePoolSize tetapi kurang dari maximumPoolSize utas yang berjalan, utas baru akan dibuat hanya jika antrian penuh.)
Sekarang, ambil contoh sederhana,
Di sini, 5 adalah corePoolSize - artinya Jvm akan membuat utas baru untuk tugas baru untuk 5 tugas pertama. dan tugas lainnya akan ditambahkan ke antrian sampai antrian penuh (50 tugas).
10 adalah maxPoolSize - JVM dapat membuat maksimal 10 thread. Berarti jika sudah ada 5 task / thread yang sedang berjalan dan antrian sudah penuh dengan 50 tugas tertunda dan jika satu lagi request / tugas baru sudah masuk antrian maka JVM akan membuat thread baru hingga 10 (total threads = sebelumnya 5 + baru 5) ;
new ArrayBlockingQueue (50) = adalah ukuran antrian total - dapat mengantri 50 tugas di dalamnya.
setelah semua 10 utas berjalan dan jika tugas baru tiba, maka tugas baru itu akan ditolak.
Aturan untuk membuat Thread secara internal oleh SUN:
Jika jumlah utas kurang dari corePoolSize, buat utas baru untuk menjalankan tugas baru.
Jika jumlah utas sama (atau lebih besar dari) corePoolSize, letakkan tugas ke dalam antrian.
Jika antrean penuh, dan jumlah utas kurang dari maxPoolSize, buat utas baru untuk menjalankan tugas.
Jika antrian penuh, dan jumlah utas lebih besar dari atau sama dengan maxPoolSize, tolak tugas.
Harapan, Ini HelpFul .. dan tolong perbaiki saya jika saya salah ...
sumber
Dari dokumen :
Selanjutnya:
sumber
Jika Anda memutuskan untuk membuat
ThreadPoolExecutor
secara manual daripada menggunakanExecutors
kelas pabrik, Anda perlu membuat dan mengonfigurasinya menggunakan salah satu konstruktornya. Konstruktor paling luas dari kelas ini adalah:Seperti yang Anda lihat, Anda dapat mengonfigurasi:
Membatasi Jumlah Tugas yang Antri
Membatasi jumlah tugas serentak yang sedang dijalankan, menentukan ukuran kumpulan thread Anda, mewakili manfaat besar bagi aplikasi Anda dan lingkungan eksekusinya dalam hal prediktabilitas dan stabilitas: pembuatan thread tak terbatas pada akhirnya akan menghabiskan sumber daya waktu proses dan aplikasi Anda mungkin mengalami sebagai konsekuensinya , masalah kinerja serius yang bahkan dapat menyebabkan ketidakstabilan aplikasi.
Itu adalah solusi hanya untuk satu bagian dari masalah: Anda membatasi jumlah tugas yang sedang dijalankan tetapi tidak membatasi jumlah pekerjaan yang dapat dikirim dan diantrekan untuk dieksekusi nanti. Aplikasi akan mengalami kekurangan sumber daya nanti, tetapi pada akhirnya akan mengalaminya jika tingkat pengiriman secara konsisten melebihi tingkat eksekusi.
Solusi untuk masalah ini adalah: Menyediakan antrian pemblokiran kepada pelaksana untuk menahan tugas yang menunggu. Jika antrian terisi, tugas yang dikirimkan akan "ditolak". The
RejectedExecutionHandler
dipanggil saat pengajuan tugas ditolak, dan bahwa itu mengapa kata kerja ditolak dikutip dalam item sebelumnya. Anda dapat menerapkan kebijakan penolakan Anda sendiri atau menggunakan salah satu kebijakan bawaan yang disediakan oleh framework.Kebijakan penolakan default membuat pelaksana melempar
RejectedExecutionException
. Namun, kebijakan bawaan lainnya memungkinkan Anda:sumber
Sumber
Aturan untuk ukuran
ThreadPoolExecutor's
kolam umumnya salah dipahami, karena tidak berfungsi sebagaimana yang Anda pikirkan atau cara yang Anda inginkan.Ambil contoh ini. Ukuran kumpulan utas awal adalah 1, ukuran kumpulan inti adalah 5, ukuran kumpulan maksimum adalah 10 dan antrian adalah 100.
Cara Sun: karena permintaan masuk utas akan dibuat hingga 5, maka tugas akan ditambahkan ke antrian sampai mencapai 100. Ketika antrian penuh, utas baru akan dibuat hingga
maxPoolSize
. Setelah semua utas digunakan dan antrian selesai, tugas akan ditolak. Saat antrian berkurang, begitu pula jumlah utas aktif.Cara yang diantisipasi pengguna: karena permintaan yang masuk dalam utas akan dibuat hingga 10, kemudian tugas akan ditambahkan ke antrean hingga mencapai 100 di mana mereka ditolak. Jumlah utas akan berganti nama maksimal sampai antrian kosong. Ketika antrian kosong, utas akan mati sampai
corePoolSize
tersisa.Perbedaannya adalah bahwa pengguna ingin mulai meningkatkan ukuran kolam lebih awal dan menginginkan antrian yang lebih kecil, sedangkan metode Sun ingin menjaga ukuran kolam tetap kecil dan hanya meningkatkannya setelah beban menjadi banyak.
Berikut adalah aturan Sun untuk pembuatan utas dalam istilah sederhana:
corePoolSize
, buat utas baru untuk menjalankan tugas baru.corePoolSize
, letakkan tugas ke antrian.maxPoolSize
, buat utas baru untuk menjalankan tugas.maxPoolSize
, tolak tugas. Panjang dan pendeknya adalah utas baru hanya dibuat ketika antrian terisi, jadi jika Anda menggunakan antrian tak terbatas maka jumlah utas tidak akan melebihicorePoolSize
.Untuk penjelasan yang lebih lengkap, dapatkan dari mulut kuda:
ThreadPoolExecutor
dokumentasi API.Ada posting forum yang sangat bagus yang memandu Anda tentang cara
ThreadPoolExecutor
kerjanya dengan contoh kode: http://forums.sun.com/thread.jspa?threadID=5401400&tstart=0Info lebih lanjut: http://forums.sun.com/thread.jspa?threadID=5224557&tstart=450
sumber
Anda dapat menemukan definisi dari istilah corepoolsize dan maxpoolsize di javadoc. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
Tautan di atas memiliki jawaban atas pertanyaan Anda. Namun, hanya untuk memperjelas. Aplikasi akan terus membuat utas hingga mencapai corePoolSize. Saya pikir idenya di sini adalah bahwa banyak utas ini harus cukup untuk menangani masuknya tugas. Jika tugas baru muncul setelah utas corePoolSize dibuat, tugas akan diantrekan. Setelah antrian penuh, pelaksana akan mulai membuat utas baru. Ini semacam keseimbangan. Apa yang dimaksud pada dasarnya adalah bahwa arus masuk tugas lebih dari sekadar kapasitas pemrosesan. Jadi, Pelaksana akan mulai membuat utas baru lagi hingga mencapai jumlah utas Maks. Sekali lagi, utas baru akan dibuat jika dan hanya jika antrian penuh.
sumber
Penjelasan bagus di blog ini :
Ilustrasi
Keluaran:
sumber
Dari buku esensi konkurensi Java :
CorePoolSize : ThreadPoolExecutor memiliki atribut corePoolSize yang menentukan berapa banyak utas yang akan dimulai hingga utas baru hanya dimulai ketika antrian penuh
MaximumPoolSize : Atribut ini menentukan berapa banyak utas yang dimulai secara maksimal. Anda dapat mengatur ini ke Integer. MAX_VALUE agar tidak memiliki batas atas
sumber
java.util.concurrent.ThreadPoolExecutor
sumber
Memahami perilaku internal
ThreadPoolExecutor
ketika tugas baru dikirimkan membantu saya memahami bagaimanacorePoolSize
danmaximumPoolSize
berbeda.Membiarkan:
N
menjadi jumlah utas di pangkalangetPoolSize()
,. Utas aktif + utas diam.T
menjadi jumlah tugas yang diserahkan ke pelaksana / kumpulan.C
menjadi ukuran kumpulan inti ,getCorePoolSize()
. Berapa banyak utas yang dapat dibuat paling banyak per kumpulan untuk tugas masuk sebelum tugas baru masuk ke antrean .M
menjadi ukuran kolam maksimum ,getMaximumPoolSize()
. Jumlah maksimum utas yang dapat dialokasikan kumpulan.Perilaku
ThreadPoolExecutor
di Java saat tugas baru dikirimkan:N <= C
, utas diam tidak diberi tugas masuk baru, melainkan utas baru dibuat.N > C
dan jika ada utas yang tidak aktif, maka tugas baru ditetapkan di sana.N > C
dan jika TIDAK ada utas yang tidak aktif, tugas baru dimasukkan ke dalam antrian. TIDAK ADA BENANG BARU YANG DIBUAT DI SINI.M
. JikaM
tercapai, kami menolak tugas. Yang penting untuk tidak dilakukan di sini adalah kami tidak membuat utas baru hingga antrian penuh!Sumber:
Contoh
Contoh dengan
corePoolSize = 0
danmaximumPoolSize = 10
dengan kapasitas antrian50
.Ini akan menghasilkan satu utas aktif di kumpulan hingga antrean memiliki 50 item di dalamnya.
Contoh dengan
corePoolSize = 10
danmaximumPoolSize = 10
dengan kapasitas antrian50
.Ini akan menghasilkan 10 utas aktif di kumpulan. Ketika antrian memiliki 50 item di dalamnya, tugas akan ditolak.
sumber