Keadaan utas
Diagram Status Thread:
menjelaskan:
Thread termasuk 5 negara berikut.
1. Status Baru : Setelah objek utas dibuat, ia memasuki keadaan baru. Misalnya, utas utas = utas baru ().
2. Runnable: Juga dikenal sebagai "negara yang dapat dieksekusi". Setelah objek utas dibuat, utas lain memanggil metode start () objek untuk memulai utas. Misalnya, thread.start (). Sebuah utas dalam keadaan siap dapat dijadwalkan untuk dieksekusi oleh CPU kapan saja.
3. Status Menjalankan: Utas memperoleh izin CPU untuk dieksekusi. Perlu dicatat bahwa utas hanya dapat memasuki keadaan berjalan dari keadaan siap.
4. Status yang diblokir: Keadaan yang diblokir berarti bahwa utas tersebut menyerahkan hak penggunaan CPU untuk beberapa alasan dan sementara berhenti berjalan. Tidak sampai utas memasuki keadaan siap, ia memiliki kesempatan untuk pergi ke keadaan berjalan. Ada tiga jenis penyumbatan:
(1) Menunggu untuk memblokir - dengan memanggil metode wait's wait (), biarkan utas menunggu untuk menyelesaikan pekerjaan tertentu.
(2) Pemblokiran yang disinkronkan-utas gagal untuk mendapatkan kunci sinkronisasi yang disinkronkan (karena kunci ditempati oleh utas lain), itu akan memasuki keadaan pemblokiran yang disinkronkan.
(3) Pemblokiran lainnya-utas akan memasuki status pemblokiran dengan menelepon tidur () atau bergabung () dari utas atau mengeluarkan permintaan I/O. Ketika status tidur () diatur waktu, bergabung () menunggu utas untuk diakhiri atau diatur waktunya, atau pemrosesan I/O selesai, utas yang dimasukkan kembali ke keadaan siap.
5. Status Mati: Utas telah selesai mengeksekusi atau keluar dari metode run () karena pengecualian, dan utas mengakhiri siklus hidupnya.
Isi yang terlibat dalam 5 negara bagian ini termasuk kelas objek, utas dan kata kunci yang disinkronkan. Kami akan mempelajari konten ini satu per satu di bab -bab berikut.
Kelas objek, mendefinisikan fungsi tidur/bangun seperti tunggu (), notify (), notifyall (), dll.
Kelas Thread Menentukan beberapa fungsi operasi utas kolom. Misalnya, fungsi tidur () fungsi tidur, interupsi () fungsi interupsi, getName () Dapatkan nama utas, dll.
Sinkronisasi adalah kata kunci; Ini dibedakan dengan blok kode yang disinkronkan dan metode yang disinkronkan. Fungsi sinkronisasi adalah untuk memungkinkan utas untuk memperoleh kunci sinkronisasi objek.
Ketika kami memperkenalkan tunggu (), notify () dan metode lain secara rinci nanti, kami akan menganalisis mengapa "tunggu (), beri tahu () dan metode lain harus didefinisikan dalam kelas objek, bukan kelas utas."
Dua cara untuk mengimplementasikan multi-threading: utas dan runnable
Runnable adalah antarmuka yang hanya berisi satu metode run (). Definisi ini adalah sebagai berikut:
antarmuka publik runnable {public abstract void run ();} Peran runnable, mengimplementasikan multi-threading. Kami dapat mendefinisikan Kelas A untuk mengimplementasikan antarmuka yang dapat dijalankan; Kemudian buat utas baru melalui utas baru (A () baru) dan metode lainnya.
Thread adalah kelas. Thread sendiri mengimplementasikan antarmuka yang dapat dijalankan. Pernyataannya adalah sebagai berikut:
Thread kelas publik mengimplementasikan runnable {}
Peran utas adalah untuk mewujudkan multi-threading.
Persamaan dan perbedaan antara utas dan runnable:
Kesamaan antara utas dan runnable: keduanya adalah "metode implementasi multi-utas."
Perbedaan antara utas dan runnable:
Thread adalah kelas, dan Runnable adalah antarmuka; Thread sendiri adalah kelas yang mengimplementasikan antarmuka yang dapat dijalankan. Kita tahu bahwa "kelas hanya dapat memiliki satu kelas induk, tetapi dapat menerapkan banyak antarmuka", jadi runnable memiliki skalabilitas yang lebih baik.
Selain itu, Runnable juga dapat digunakan untuk "berbagi sumber daya". Artinya, beberapa utas dibuat berdasarkan objek runnable tertentu, dan mereka akan berbagi sumber daya pada objek yang dapat dilalui.
Secara umum, disarankan untuk menerapkan multi-threading melalui "runnable"!
Contoh multithreading untuk utas dan runnable
1. Contoh Multithreading dari Thread
Di bawah ini kita dapat lebih memahami utas dan dapat dikeluarkan melalui contoh, dan menggambar pada contoh online yang lebih meyakinkan. // threadtest.java kode sumber
kelas mythread memperluas utas {private int ticket = 10; public void run () {for (int i = 0; i <20; i ++) {if (this.ticket> 0) {System.out.println (this.getName ()+"tiket: tiket"+this.ticket--); }}}}}}; Public Class ThreadTest {public static void main (string [] args) {// Mulai 3 Threads T1, T2, T3; Setiap utas menjual 10 tiket! Mythread t1 = mythread baru (); Mythread t2 = mythread baru (); Mythread t3 = mythread baru (); t1.start (); t2.start (); t3.start (); }} Hasil Menjalankan:
Thread-0 Ticket Selling: ticket10Thread-1 Ticket Selling: ticket10Thread-2 Ticket Selling: ticket10Thread-1 Ticket Selling: ticket9Thread-0 Ticket Selling: ticket9Thread-1 Ticket Selling: ticket8Thread-2 Ticket Selling: ticket9Thread-1 Ticket Selling: ticket7Thread-0 Ticket Selling: ticket8Thread-1 Ticket Selling: ticket6Thread-2 Ticket Selling: ticket8Thread-1 Ticket Selling: ticket5Thread-0 Ticket Selling: ticket7Thread-1 Ticket Selling: ticket4Thread-2 Penjualan Tiket: Tiket Tiket7Thread-1 Tiket: Tiket Tiket3Thread-0: Tiket Tiket6Thread-1 Tiket: Tiket2Thread-2 Tiket: Tiket Tiket6Thread-2: Tiket Tiket5Thread-2: Tiket Tiket4Tread-1 Tiket: Tiket-Tiket-Tiket-Tiket-Tiket-2 Tiket-2 Tiket-Tiket-Tiket-2 Tiket-Tiket-Tiket-2 Tiket3: Tiket-Tiket-Tickets-2 Tiket-2 Tiket. Tiket: Tiket Ticket2Thread-0: Tiket Ticket1Thread-0: Tiket Ticket2Thread-0: Ticket1
Deskripsi Hasil:
(1) Mythread mewarisi dari utas, yang merupakan utas khusus. Setiap MyThread menjual 10 tiket.
(2) Utas utama utama membuat dan memulai 3 utas anak Mythread. Setiap utas anak menjual 10 tiket.
2. Contoh multithreaded dari runnable
Selanjutnya, kami memodifikasi program di atas. Menerapkan antarmuka melalui Runnable, dengan demikian menerapkan multi-threading.
// runnableTest.java Kode Kode Sumber MyThread mengimplementasikan runnable {private int ticket = 10; public void run () {for (int i = 0; i <20; i ++) {if (this.ticket> 0) {System.out.println (thread.currentThread (). getName ()+"Penjualan Tiket: Tiket"+this.ticket--); }}}}}; kelas publik runnableTest {public static void main (string [] args) {mythread mt = new mythread (); // Mulai 3 utas T1, T2, T3 (mereka berbagi objek yang dapat dijalankan), dan 3 utas ini menjual total 10 tiket! Thread t1 = utas baru (mt); Thread t2 = utas baru (mt); Thread t3 = utas baru (mt); t1.start (); t2.start (); t3.start (); }} Hasil Menjalankan:
Penjualan Tiket Thread-0: Tiket10Thread-2 Penjualan Tiket: Tiket8Thread-1 Tiket Penjualan: Tiket9Thread-2 Tiket Penjualan: Ticket6Thread-0 Tiket Penjualan: Tiket7Thread-2 Tiket Penjualan: Tiket4Thread-1 Penjualan Tiket: Tiket Tiket5 Tiket-2: Tiket2Thread-0 Tiket Penjualan: Tiket3Thread-1 Penjualan Tiket: Tiket Tiket1
Deskripsi Hasil:
(1) tidak seperti di atas "Mythread mewarisi dari utas"; Di sini MyThread mengimplementasikan antarmuka utas.
(2) Utas utama utama membuat dan memulai 3 utas anak, dan 3 utas anak ini semuanya dibuat berdasarkan "MT, Runnable Object". Hasil dari operasi ini adalah bahwa 3 benang anak ini terjual total 10 tiket. Ini berarti mereka berbagi antarmuka MyThread.