Tujuan komunikasi utas adalah untuk memungkinkan utas untuk mengirim sinyal satu sama lain. Selain itu, komunikasi utas juga dapat menyebabkan utas menunggu sinyal dari utas lain. Misalnya, Thread B dapat menunggu sinyal dari Thread A, yang dapat menjadi sinyal yang telah diproses dan diselesaikan oleh Thread A.
Tunggu () metode
- mengganggu eksekusi metode, buat utas ini tunggu, untuk sementara menyerahkan hak untuk menggunakan CPU, dan memungkinkan utas lain untuk menggunakan metode sinkronisasi ini
Metode Notify ()
-Memuat menunggu di ujung utas menunggu karena penggunaan pesta sinkron ini
Metode NotifyAll ()
Bangun semua utas menunggu akhir menunggu karena penggunaan metode sinkronisasi ini
Kapan Menggunakan Metode Tunggu
Ketika suatu variabel digunakan dalam metode sinkronisasi yang digunakan oleh utas, dan variabel ini perlu dimodifikasi oleh utas lain untuk memenuhi kebutuhan utas ini, maka Anda dapat menggunakan metode tunggu () dalam metode sinkronisasi
Di sini saya akan mengambil contoh di kelas sebagai contoh untuk secara singkat menggambarkan peran menunggu dan memberi tahu
Kita sudah tahu bahwa dalam multi-threading, seperti menjual tiket, urutan tiket yang dijual di setiap jendela adalah acak. Jika kami memiliki 2 tiket penjualan jendela, ditetapkan bahwa 100 tiket harus dijual secara bergantian. Setelah menjual satu tiket di jendela A, tiket berikutnya harus dijual dengan jendela B. Bagaimana kami menerapkan fungsi ini?
Pertama -tama, saya pikir jika pernyataan dapat diatur. If (i%2 == 0) Kemudian utas 1 berjalan, jika tidak utas 2 berjalan, tetapi menjalankan utas 1 dan utas 2 adalah acak, dan tidak dapat ditentukan untuk menentukan siapa yang berjalan berdasarkan ukuran i.
Kemudian kita dapat menggunakan tunggu () dan memberi tahu () di utas
Setelah utas 1 selesai, tunggu sebentar, lalu utas 2 berjalan, dan setelah utas 2 selesai, lalu bangun utas 1 dan kemudian lagi
Setelah utas 1 selesai, tunggu sebentar, lalu utas 2 dijalankan, dan setelah utas 2 selesai, lalu bangun utas 1
Dengan cara ini, Thread 1 dan Thread 2 dapat dijalankan secara bergantian
Kami telah mencetak 10 angka sebagai contoh untuk menulis program, dan membangun total 2 kelas myprint dan myprinttest
Myprint.java
kelas publik myprint mengimplementasikan runnable {private int i = 0; @Override public void run () {try {print ();} catch (interruptedexception e) {// TODO Auto-generated catch block e.printstacktrace ();}} public yang disinkronkan void print () Throwsing () Public Void Print () Throwse Public Void Print () InterruptedException {while (i <10) {System.out.println (thread.currentThread (). GetName ()+":"+i); i ++; notify (); coba {tunggu ();}}}}}}} {);Hasilnya ditunjukkan pada gambar
Anda dapat melihat bahwa Thread 1 dan Thread 2 telah diimplementasikan untuk mencetak secara bergantian satu sama lain.
Pahami saja proses berjalannya
while (i <10) {System.out.println (thread.currentThread (). getName ()+":"+i); i ++; notify (); coba {tunggu ();}}}}}}}} {e.printstacktrace ();}}}}}}Saat saya <10, cetak utas 1 dan kemudian lakukan bangun. Karena tidak ada utas di depan, langkah ini tidak dieksekusi. Kemudian utas 1 menunggu. Setelah menjalankan utas 2, membangunkan utas sebelumnya, yaitu, utas 1, dan kemudian mencetak utas 1,
Proses ini berlanjut sampai loop pecah, sehingga kami dapat melakukan rotasi
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang membahas secara singkat peran menunggu dan memberi tahu dalam komunikasi utas. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!