Komunikasi antara benang dalam Java: Penjelasan terperinci tentang senario aplikasi praktikal menunggu dan memberitahu
Dalam pengaturcaraan berbilang benang, komunikasi antara utas ialah teknologi penting. Java menyediakan dua kaedah asas komunikasi antara benang, iaitu menggunakan kaedah menunggu dan memberitahu objek. Artikel ini akan menganalisis senario aplikasi sebenar menunggu dan memberitahu secara terperinci serta memberikan contoh kod khusus.
Dalam pengaturcaraan berbilang benang, komunikasi antara benang merujuk kepada kerjasama antara berbilang benang untuk menyelesaikan tugas tertentu. Benang selalunya perlu berkongsi pembolehubah, data atau sumber, dan mekanisme diperlukan untuk memastikan penyegerakan dan susunan. Java menyediakan cara untuk melaksanakan komunikasi antara benang berdasarkan pemantau objek, iaitu, menggunakan kaedah tunggu dan maklumkan objek.
Kaedah tunggu ialah kaedah dalam kelas Objek, yang meletakkan benang semasa ke dalam keadaan menunggu dan melepaskan kunci objek. Kaedah ini perlu dipanggil dalam blok kod disegerakkan atau kaedah disegerakkan, dan hanya boleh dipanggil oleh benang yang memegang kunci objek. Kaedah tunggu biasanya digunakan bersama dengan kaedah pemberitahuan untuk melaksanakan mekanisme menunggu dan bangun benang.
Kaedah pemberitahuan ialah kaedah dalam kelas Objek, yang digunakan untuk membangunkan benang menunggu. Kaedah pemberitahuan perlu dipanggil dalam blok kod disegerakkan atau kaedah disegerakkan, dan hanya boleh dipanggil oleh benang yang memegang kunci objek. Kaedah pemberitahuan secara rawak membangunkan utas menunggu dan meletakkannya dalam keadaan sedia.
Berikut ialah beberapa senario penggunaan biasa, menunjukkan cara menggunakan kaedah tunggu dan pemberitahuan untuk mencapai komunikasi antara utas.
3.1 Model Pengeluar-Pengguna
Model pengeluar-pengguna ialah masalah penyegerakan utas klasik, di mana satu atau lebih utas bertindak sebagai pengeluar, menjana data dan memasukkannya ke dalam penimbal dikongsi yang lain Atau berbilang utas bertindak sebagai pengguna, mengambil data daripada penimbal dan memprosesnya. Di bawah model ini, komunikasi diperlukan antara pengeluar dan pengguna untuk memastikan pengeluar menunggu apabila penimbal penuh dan pengguna menunggu apabila penimbal kosong.
Berikut ialah contoh mudah yang menunjukkan cara melaksanakan model pengeluar-pengguna menggunakan kaedah tunggu dan maklumkan:
public class ProducerConsumerExample { private List<Integer> buffer = new ArrayList<>(); private int maxSize = 5; public synchronized void produce() throws InterruptedException { while (buffer.size() == maxSize) { wait(); } Random random = new Random(); int value = random.nextInt(100); buffer.add(value); System.out.println("Produced: " + value); notifyAll(); } public synchronized void consume() throws InterruptedException { while (buffer.size() == 0) { wait(); } int value = buffer.remove(0); System.out.println("Consumed: " + value); notifyAll(); } }
Dalam contoh ini, kelas ProducerConsumerExample melaksanakan logik pengeluar dan pengguna. Dalam kaedah menghasilkan, jika penimbal penuh, utas memasuki keadaan menunggu (memanggil kaedah tunggu) sehingga pengguna menggunakan data dan memanggil kaedah notifyAll untuk membangunkan utas pengeluar menunggu. Begitu juga, dalam kaedah penggunaan, jika penimbal kosong, utas memasuki keadaan menunggu sehingga pengeluar menghasilkan data dan memanggil kaedah notifyAll untuk membangunkan utas pengguna yang menunggu. . Dalam senario ini, anda juga boleh menggunakan kaedah tunggu dan maklumkan untuk mencapai kerjasama rangkaian.
Berikut ialah contoh mudah yang menunjukkan cara menggunakan kaedah tunggu dan pemberitahuan untuk mencapai kerjasama rangkaian:
public class ThreadCooperationExample { private boolean isTask1Completed = false; public synchronized void task1() throws InterruptedException { while (!isTask1Completed) { wait(); } System.out.println("Task 1 completed"); } public synchronized void task2() { System.out.println("Task 2 started"); // 执行任务2的代码 isTask1Completed = true; notify(); } }
Dalam contoh ini, kelas ThreadCooperationExample melaksanakan dua tugasan task1 dan task2. Dalam tugas1, utas akan terus menyemak status isTask1Completed Jika ia palsu, ia akan memasuki keadaan menunggu (panggil kaedah tunggu) sehingga tugas2 menetapkan isTask1Completed kepada benar dan kemudian memanggil kaedah pemberitahuan untuk membangunkan utas tugas1 menunggu.
RingkasanAtas ialah kandungan terperinci Perbincangan mendalam tentang kes aplikasi praktikal menunggu dan memberitahu dalam Java: Penjelasan terperinci tentang komunikasi antara benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!