Dengan meningkatnya jumlah core CPU, tidak dapat dihindari untuk menggunakan teknologi multi-threading untuk memanfaatkan daya komputasi sepenuhnya. Oleh karena itu, teknologi multi-threading adalah teknologi yang harus dikuasai pengembang server.
Penciptaan dan penghancuran utas melibatkan panggilan sistem dan mengkonsumsi sumber daya sistem, sehingga teknologi pengumpulan utas diperkenalkan untuk menghindari pembuatan dan penghancuran utas yang sering.
Di Java, ada kelas alat pelaksana yang dapat membuat kumpulan utas untuk kami. Essensinya adalah untuk objek threadpoolexecutor baru. Kolam utas hampir juga harus diambil dalam pertanyaan wawancara. Bagian ini menggabungkan kode sumber untuk berbicara tentang prinsip kerja ThreadExecutor
1. Penciptaan Pool Thread
Mari pertama -tama lihat parameter konstruktor paling lengkap dari ThreadPoolExecutor:
① CorePoolsize: Jumlah utas inti di kumpulan utas. Terus terang, bahkan jika tidak ada tugas di kolam utas, akan ada utas corePoolsize menunggu tugas.
②MaximumpoolSize: Jumlah maksimum utas. Tidak peduli berapa banyak tugas yang Anda kirimkan, jumlah maksimum utas pekerja di kumpulan utas adalah maximumpoolSize.
③ Keepalivetime: Waktu bertahan hidup utas. Ketika jumlah utas di kumpulan utas lebih besar dari corePoolsize, jika tidak ada tugas untuk dieksekusi setelah menunggu kipervetime, utas keluar.
⑤unit: Ini digunakan untuk menentukan unit Keepalivetime, seperti detik: TimeUnit.seconds.
⑥ WorkQueue: Antrian pemblokiran, dan tugas yang diajukan akan ditempatkan dalam antrian ini.
⑦ ThreadFactory: Pabrik utas, digunakan untuk membuat utas, terutama untuk memberi nama utas. Nama utas pabrik default adalah Pool-1-Thread-3.
⑧Handler: Tolak kebijakan, dipanggil ketika utas di kumpulan utas habis dan antriannya penuh.
Di atas adalah parameter yang digunakan saat membuat kumpulan utas. Pewawancara sering mengajukan pertanyaan ini selama wawancara.
2. Proses eksekusi kumpulan utas
Berikut adalah diagram untuk menggambarkan proses eksekusi kumpulan utas
Ketika tugas dikirimkan ke kumpulan utas, pertama -tama akan menentukan apakah jumlah utas saat ini kurang dari CorePoolsize. Jika kurang dari, utas akan dibuat untuk menjalankan tugas yang dikirimkan. Kalau tidak, tugas akan dimasukkan ke dalam antrian workqueue. Jika workqueue penuh, itu akan menentukan apakah jumlah utas saat ini kurang dari maximumpoolSize. Jika kurang dari, utas akan dibuat untuk menjalankan tugas. Kalau tidak, penangan akan dipanggil untuk menunjukkan bahwa kumpulan utas menolak untuk menerima tugas.
Di sini, ambil kode sumber JDK1.8.0_111 sebagai contoh untuk melihat implementasi spesifik.
1. Pertama -tama lihat metode eksekutor kumpulan utas
①: Tentukan apakah jumlah utas aktif saat ini kurang dari corePoolsize. Jika kurang dari, hubungi AddWorker untuk membuat utas untuk menjalankan tugas
②: Jika tidak kurang dari CorePoolsize, tambahkan tugas ke antrian workqueue.
③: Jika workqueue dimasukkan ke dalam workqueue, utas penciptaan akan menjalankan tugas. Jika utas pembuatan gagal saat ini (jumlah utas saat ini tidak kurang dari maximumpoolSize), tolak akan dipanggil (penangan panggilan internal) dan menolak untuk menerima tugas tersebut.
2. Mari kita lihat implementasi metode addWorker
Sepotong kode ini adalah saat membuat utas non-core, yaitu, inti sama dengan false. Tentukan apakah jumlah utas saat ini lebih besar dari atau sama dengan MaximumpoolSize. Jika lebih besar dari atau sama dengan false, yaitu, penciptaan utas gagal dalam ③ yang disebutkan di atas.
Paruh kedua dari metode addWorker:
① Buat objek pekerja dan instantiate objek utas.
②Tart utas ini
3. Pergi ke pekerja untuk melihat implementasinya
Anda dapat melihat bahwa ThreadFactory dipanggil saat membuat pekerja untuk membuat utas. Memulai utas di atas ② akan memicu metode menjalankan pekerja untuk dipanggil oleh utas.
4. Selanjutnya, mari kita lihat logika metode runworker.
Thread memanggil runwoker, dan akan memanggil metode gettask saat loop untuk membaca tugas dari workerqueue, dan kemudian menjalankan tugas. Selama metode gettask tidak mengembalikan nol, utas ini tidak akan keluar.
5. Akhirnya, mari kita lihat implementasi metode gettask
① Mari kita abaikan AllowCorethreadTimeout, nilai default variabel ini salah. WC> corePoolsize menentukan apakah jumlah utas saat ini lebih besar dari corePoolsize.
② Jika jumlah utas saat ini lebih besar dari corePoolsize, metode jajak pendapat workqueue akan dipanggil untuk mendapatkan tugas, dan batas waktu adalah Keepalivetime. Jika waktu Keepalivetime melebihi batas waktu, jajak pendapat mengembalikan nol, dan sementara yang disebutkan di atas akan keluar secara berurutan, dan utas akan dieksekusi.
Jika jumlah utas saat ini kurang dari corePoolsize, metode workqueue mengambil untuk diblokir saat ini.
Artikel di atas didasarkan pada prinsip kerja dan interpretasi kode sumber dari kumpulan utas. Artikel ini adalah semua konten yang dibagikan oleh editor. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.