1. Pendahuluan
Penggunaan rasional kumpulan benang dapat membawa tiga manfaat. Pertama: Kurangi konsumsi sumber daya. Kurangi konsumsi yang disebabkan oleh pembuatan utas dan penghancuran dengan menggunakan kembali utas yang dibuat. Kedua: Tingkatkan kecepatan respons. Ketika tugas tiba, tugas dapat dieksekusi segera setelah utas dibuat. Ketiga: Tingkatkan pengelolaan utas. Thread adalah sumber daya yang langka. Jika dibuat tanpa batas, mereka tidak hanya akan mengkonsumsi sumber daya sistem, tetapi juga mengurangi stabilitas sistem. Menggunakan kumpulan benang dapat berupa alokasi, penyetelan, dan pemantauan terpadu. Namun, untuk menggunakan kumpulan benang secara rasional, Anda harus tahu prinsip -prinsipnya dengan baik.
2. Penggunaan Benang Pool
Empat jenis utas yang disediakan oleh Executors 1.NewCachedThreadPool membuat kumpulan utas yang dapat di -cache. Jika panjang kumpulan utas melebihi kebutuhan pemrosesan, ia dapat mendaur ulang benang idle secara fleksibel. Jika tidak ada daur ulang, buat utas baru. 2.NewfixedThreadPool membuat kumpulan benang panjang tetap yang dapat mengontrol jumlah maksimum concurrency utas, dan kelebihan utas akan menunggu dalam antrian. 3.NewsCheduledThreadPool membuat kumpulan benang panjang tetap yang mendukung eksekusi tugas waktu dan berkala. 4.NewsinglethreadExecutor membuat kumpulan utas utas tunggal, yang hanya akan menggunakan utas pekerja yang unik untuk menjalankan tugas, memastikan bahwa semua tugas dieksekusi dalam urutan yang ditentukan (FIFO, LIFO, Prioritas).
1.NewCachedThreadPool membuat kolam benang yang bisa di -cache. Jika panjang kumpulan utas melebihi kebutuhan pemrosesan, ia dapat mendaur ulang benang idle secara fleksibel. Jika tidak ada daur ulang, buat utas baru. Contohnya adalah sebagai berikut
ExecutorService ExecutorService = Executors.NewCachedThreadPool (); untuk (int i = 0; i <5; i ++) {indeks int akhir = i; coba {thread.sleep (indeks * 1000); } catch (InterruptedException e) {E.PrintStackTrace (); } ExecutorService.execute (runnable baru () {@Override public void run () {System.out.println (thread.currentThread (). GetName () + "," + index);}});} // Informasi konsol () + " Pool-1-thread-1,0pool-1-thread-1,1pool-1-thread-1,2pool-1-thread-1,3pool-1-thread-1,42.NewfixedThreadPool membuat kumpulan benang panjang tetap yang dapat mengontrol jumlah maksimum concurrency utas, dan kelebihan utas akan menunggu dalam antrian. Contohnya adalah sebagai berikut
ExecutorService fixedThreadPool = executors.newfixedThreadPool (4); for (int i = 0; i <5; i ++) {final int index = i; FixedThreadPool.execute (runnable baru () {@Override public void run () {try {System.out.println (thread.currentThread (). getName () + "," + index); thread.sleep (2000);} catch (interupredException e) {e.printstacktack (2000); Pool-1-thread-1,0pool-1-thread-2,1pool-1-thread-3,2pool-1-thread-4,3pool-1-thread-1,43.NewsCheduledThreadPool Buat kumpulan benang panjang tetap, dan contoh siklus pendukung dan tugas waktu adalah sebagai berikut
TerjadwalExecutorService StorduledThreadPool = Executors.newscheduledThreadPool (5); System.out.println ("Sebelum:" + System.CurrentTimeMillis ()/1000); JadwalTHreadPool.schedule (runnable baru () {@Override public void run () {System.out.println ("Eksekusi tertunda selama 3 detik:" + System.currentTimeMillis ()/1000);}}, 3, timeunit.seconds); System.out.printl +System.currentTimeMillis ()/1000); // Informasi konsol Sebelum: 1518012703After: 1518012703 Ditunda selama 3 detik: 1518012706System.out.println ("Sebelum:" +System.CurrentTimeMillis ()/1000); Runnable () {@Override public void run () {System.out.println ("Setelah penundaan 1 detik, eksekusi sekali dalam 3 detik:" +System.currentTimeMillis ()/1000);Pesan konsol
Sebelum: 1518013024
Setelah: 1518013024
Setelah 1 detik penundaan, jalankan sekali dalam 3 detik: 1518013025
Setelah 1 detik penundaan, jalankan sekali dalam 3 detik: 1518013028
Setelah 1 detik penundaan, jalankan sekali dalam 3 detik: 1518013031
4.NewsinglethreadExecutor membuat kumpulan utas utas tunggal, yang hanya menggunakan utas pekerja untuk menjalankan tugas, memastikan pesanan. Contohnya adalah sebagai berikut
ExecutorService singlethreadExecutor = executors.newsinglethreadExecutor (); for (int i = 0; i <10; i ++) {final int index = i; singlethreadexecutor.execute (runnable baru () {@Override public void run () {try {System.out.println (thread.currentThread (). getName () + "," + index); thread.sleep (2000);} catch (interupred exception e) {e.sprintstack (2000);} catch (interruptException e) {e.sprintstack (2000);Informasi konsol
Pool-1-thread-1,0
Pool-1-thread-1,1
Pool-1-thread-1,2
Pool-1-thread-1,3
Pool-1-thread-1,4
Kirimkan tugas ke kumpulan benang. Perbedaan antara execute () dan submit () di kelas ThreadPoolExecutor sebenarnya adalah metode yang dinyatakan dalam pelaksana. Ini diimplementasikan di ThreadPoolExecutor. Metode ini adalah metode inti ThreadPoolExecutor. Melalui metode ini, suatu tugas dapat diserahkan ke kumpulan utas dan diserahkan ke kumpulan utas untuk dieksekusi.
Metode pengiriman () adalah metode yang dinyatakan dalam ExecutorService. Ini telah diimplementasikan di AbstractExecutorService. Itu tidak ditulis ulang di ThreadPoolExecutor. Metode ini juga digunakan untuk mengirimkan tugas ke kumpulan utas. Namun, ini berbeda dari metode Execute (). Itu dapat mengembalikan hasil eksekusi tugas. Periksa implementasi metode pengiriman () melalui kode sumber dan Anda akan menemukan bahwa itu sebenarnya adalah metode yang dieksekusi (), tetapi menggunakan masa depan untuk mendapatkan hasil eksekusi dari tugas tersebut.
/** * @throws RejectExecutionException {@inHeritDoc} * @throws nullpointerException {@inHeritDoc} */Masa Depan Publik <?> Kirim (Runnable Task) {if (Task == NULL) Lempar NullPointerException baru (); RunnableFuture <void> ftask = newTaskfor (tugas, null); Execute (fTask); return fTask;}Tutup kumpulan utas kita dapat menutup kumpulan utas dengan memanggil metode shutdown atau shutdownnow dari kumpulan utas, tetapi prinsip implementasinya berbeda. Prinsip shutdown adalah dengan hanya mengatur keadaan kumpulan utas ke status shutdown, dan kemudian mengganggu semua utas yang tidak melaksanakan tugas. Prinsip shutdownnow adalah untuk melintasi utas pekerja di kumpulan utas, dan kemudian memanggil metode interupsi utas satu per satu untuk mengganggu utas, jadi tugas yang tidak dapat menanggapi interupsi mungkin tidak akan pernah diakhiri. Shutdownnow pertama -tama akan menetapkan keadaan kumpulan utas untuk berhenti, kemudian mencoba untuk menghentikan semua utas yang mengeksekusi atau berhenti dari tugas, dan kembali ke daftar menunggu tugas dieksekusi.
Selama salah satu dari dua metode penutupan ini disebut, metode isshutdown akan mengembalikan true. Ketika semua tugas telah ditutup, itu berarti bahwa kumpulan benang berhasil ditutup. Memanggil metode isterminaed akan mengembalikan true. Adapun metode mana yang harus kita hubungi untuk menutup kumpulan utas, itu harus ditentukan oleh karakteristik tugas yang diserahkan ke kumpulan utas. Biasanya, shutdown dipanggil untuk menutup kumpulan utas. Jika tugas tidak harus dieksekusi, shutdownnow dapat dipanggil.
3. Analisis kumpulan utas
Analisis Proses: Alur kerja utama kumpulan utas ditunjukkan pada gambar di bawah ini: Alur kerja utama kumpulan benang java
Dari gambar di atas kita dapat melihat bahwa ketika mengirimkan tugas baru ke kumpulan utas, aliran pemrosesan kumpulan utas adalah sebagai berikut:
** Analisis Kode Sumber. ** Analisis proses di atas memungkinkan kita untuk secara intuitif memahami prinsip kerja kumpulan utas. Mari kita gunakan kode sumber untuk melihat bagaimana itu diimplementasikan. Kumpulan utas menjalankan tugas sebagai berikut:
public void execute (runnable command) {if (command == null) lempar nullpointerException baru (); int c = ctl.get (); if (workercountof (c) <corepoolsize) {if (addWorker (command, true)) return; c = ctl.get (); } if (isRunning (c) && workqueue.offer (perintah)) {int recheck = ctl.get (); if (! isRunning (periksa ulang) && hapus (perintah)) tolak (perintah); lain jika (workercountof (periksa ulang) == 0) addworker (null, false); } lain jika (! addWorker (perintah, false)) tolak (perintah);} Utas pekerja. Saat kumpulan utas membuat utas, itu akan merangkum utas menjadi utas pekerja. Setelah pekerja mengeksekusi tugas, itu juga akan berulang kali untuk mendapatkan tugas dalam antrian kerja untuk dieksekusi.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.