Artikel ini mengikuti artikel sebelumnya "Penjelasan terperinci tentang contoh multithreading Java (i)".
4. Status pemblokiran dan kontrol utas java multithreads
Beberapa jenis pemblokiran Java tertentu telah disebutkan di atas. Mari kita lihat metode utama yang menyebabkan penyumbatan benang java.
1.nein ()
Bergabunglah - Biarkan satu utas menunggu utas lain untuk diselesaikan sebelum melanjutkan eksekusi. Jika utas A dipanggil dalam metode join B Thread B dalam badan eksekusi utas, utas A diblokir dan hanya setelah utas B diketahui telah menyelesaikan eksekusi Thread B, A dapat terus mengeksekusi.
Public Class ThreadTest {public static void main (string [] args) {myRunnable myrunnable = new myrunnable (); Thread thread = utas baru (myRunnable); untuk (int i = 0; i <100; i ++) {System.out.println (thread.currentThread (). getName () + "" + i); if (i == 30) {thread.start (); coba {thread.join (); // Utas utama perlu menunggu utas utas untuk dieksekusi sebelum terus mengeksekusi} catch (InterruptedException e) {E.PrintStackTrace (); }}}}}}}}}}}}}}}}}}}}}}}}2.sleep ()
Tidur - Biarkan utas yang saat ini dieksekusi menjeda waktu yang ditentukan dan masukkan keadaan pemblokiran. Selama periode waktu tidur, utas tidak akan mendapatkan kesempatan untuk mengeksekusi karena tidak dalam keadaan siap. Bahkan jika tidak ada utas lain yang dapat dieksekusi dalam sistem saat ini, utas dalam tidur () tidak akan dijalankan. Oleh karena itu, metode tidur () sering digunakan untuk menjeda eksekusi utas.
Seperti yang disebutkan sebelumnya, ketika metode start () dari utas yang baru dibuat dipanggil, utas memasuki keadaan siap dan dapat memperoleh irisan waktu CPU pada suatu waktu untuk dieksekusi. Jika Anda ingin utas baru segera dieksekusi dengan kebutuhan tertentu, cukup hubungi tidur (1) dari utas asli secara langsung.
Public Class ThreadTest {public static void main (string [] args) {myRunnable myrunnable = new myrunnable (); Thread thread = utas baru (myRunnable); untuk (int i = 0; i <100; i ++) {System.out.println (thread.currentThread (). getName () + "" + i); if (i == 30) {thread.start (); coba {thread.sleep (1); // Pastikan utasnya akan segera dieksekusi} catch (InterruptedException e) {e.printstacktrace (); }}}}}}}}}}}}}}}}}}}}}}}}Catatan: Tidur selama satu milidetik sudah cukup, karena CPU tidak akan menganggur dan akan beralih ke utas yang baru dibuat.
3. Benang latar (benang daemon)
Konsep/Tujuan: Utas latar belakang terutama menyediakan layanan ke utas lain (relatif disebut utas latar depan), atau "benang daemon". Seperti utas pengumpulan sampah di JVM.
Siklus hidup: Siklus hidup utas latar belakang terkait dengan siklus hidup utas latar depan. Ini terutama tercermin dalam: Ketika semua utas latar depan memasuki keadaan mati, utas latar belakang akan secara otomatis mati (pada kenyataannya, ini mudah dimengerti, karena tujuan utas latar belakang adalah untuk melayani utas latar depan. Karena semua utas latar depan telah mati, apa gunanya tetap menjaganya ... Hebat!).).
Mengatur utas latar: Memanggil metode setdaemon (true) dari objek utas dapat mengatur utas yang ditentukan sebagai utas latar.
Public Class ThreadTest {public static void main (string [] args) {thread mythread = new mythread (); untuk (int i = 0; i <100; i ++) {System.out.println ("Utas utama i ="+i); if (i == 20) {mythread.setdaemon (true); mythread.start (); }}}}} kelas MyThread memperluas utas {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("i ="+i); coba {thread.sleep (1); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); }}}}Tentukan apakah utasnya adalah utas latar: Panggil metode isDeamon () dari objek utas.
CATATAN: Utas utama adalah utas latar depan secara default, utas anak yang dibuat dalam pembuatan utas latar depan adalah utas latar depan secara default, dan utas yang dibuat di utas latar belakang adalah utas latar belakang secara default. Saat memanggil metode setDeamon (true) untuk mengatur utas latar depan sebagai utas latar belakang, itu harus dipanggil sebelum metode start () dipanggil. Setelah utas mati sehari sebelum kemarin, JVM memberi tahu utas latar belakang untuk mati, tetapi dibutuhkan waktu tertentu dari menerima instruksi untuk merespons.
4. Ubah prioritas utas/setPriority ():
Setiap utas memiliki prioritas tertentu saat mengeksekusi, dan utas dengan prioritas tinggi memiliki lebih banyak peluang eksekusi. Setiap utas memiliki prioritas yang sama dengan utas yang membuatnya. Utas utama memiliki prioritas normal secara default.
Setel Thread Prioritas: SetPriority (int PriortionalLevel). Kisaran parameter prioritas adalah antara 1-10, dan tiga nilai konstan statis yang umum digunakan adalah sebagai berikut:
MAX_PRIORITY: 10
Min_priority: 1
Norm_priority: 5
Dapatkan prioritas utas: getPriority ().
Catatan: Objek utas dengan prioritas utas yang lebih tinggi hanya berarti bahwa utas ini memiliki lebih banyak peluang eksekusi, daripada eksekusi prioritas.
Public Class ThreadTest {public static void main (string [] args) {thread mythread = new mythread (); untuk (int i = 0; i <100; i ++) {System.out.println ("Utas utama i ="+i); if (i == 20) {myThread.setPriority (thread.max_priority); mythread.start (); }}}}} kelas MyThread memperluas utas {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("i ="+i); }}}5. Konsesi Thread: Hasil ()
Peran dasar hasil () telah dibahas dalam posting blog sebelumnya. Pada saat yang sama, metode hasil () juga terkait dengan prioritas utas. Ketika utas memanggil metode Eiled () untuk beralih dari keadaan berjalan ke keadaan siap, CPU hanya akan memilih utas dengan prioritas yang sama atau prioritas yang lebih tinggi seperti utas dari antrian utas negara siap untuk dieksekusi.
Public Class ThreadTest {public static void main (string [] args) {thread mythread1 = new myThread1 (); Thread myThread2 = myThread2 baru (); myThread1.setPriority (thread.max_priority); mythread2.setPriority (thread.min_priority); untuk (int i = 0; i <100; i ++) {System.out.println ("Utas utama i ="+i); if (i == 20) {mythread1.start (); mythread2.start (); Thread.yield (); }}}}} kelas myThread1 memperluas utas {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("MyThread 1 - i ="+i); }}} kelas myThread2 memperluas utas {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("MyThread 2 - i ="+i); }}}Serangkaian artikel:
Penjelasan Java Multi-Threaded Instances (I)
Penjelasan terperinci tentang Java Multi-Threaded Instances (II)
Penjelasan terperinci tentang Java Multi-Threaded Instances (III)