Menggunakan Wait() dan Notify() dalam Java: Senario dengan Baris Gilir
Soalan:
Bolehkah anda memberikan panduan menyeluruh tentang cara melaksanakan kaedah wait() dan notify() dengan Beratur?
Jawapan:
Prinsip Tunggu() dan Maklumkan()
Tunggu() dan maklumkan() dayakan penyelarasan benang dengan meminta benang menunggu syarat tertentu untuk dipenuhi sebelum meneruskan. Dalam kes ini, kami berminat untuk membuat baris gilir menyekat yang menguatkuasakan pengehadan kapasiti.
Pelaksanaan
public class BlockingQueue<T> { private Queue<T> queue = new LinkedList<>(); private int capacity; public BlockingQueue(int capacity) { this.capacity = capacity; } public synchronized void put(T element) throws InterruptedException { while (queue.size() == capacity) { wait(); } queue.add(element); notify(); // Notify waiting threads } public synchronized T take() throws InterruptedException { while (queue.isEmpty()) { wait(); } T item = queue.remove(); notify(); // Notify waiting threads return item; } }
Cara Ia Berfungsi
Nota: Pastikan bahawa panggilan tunggu() dan notify() adalah disegerakkan pada objek yang sama dan diletakkan dalam gelung sementara untuk mengendalikan bangun tidur palsu.
Ciri Serentak Java 1.5
Java 1.5 memperkenalkan pakej java.util.concurrent , menyediakan abstraksi peringkat lebih tinggi untuk penyelarasan benang. Berikut ialah versi contoh yang dikemas kini:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BlockingQueue<T> { private Queue<T> queue = new LinkedList<>(); private int capacity; private Lock lock = new ReentrantLock(); private Condition notFull = lock.newCondition(); private Condition notEmpty = lock.newCondition(); public BlockingQueue(int capacity) { this.capacity = capacity; } public void put(T element) throws InterruptedException { lock.lock(); try { while (queue.size() == capacity) { notFull.await(); } queue.add(element); notEmpty.signal(); } finally { lock.unlock(); } } public T take() throws InterruptedException { lock.lock(); try { while (queue.isEmpty()) { notEmpty.await(); } T item = queue.remove(); notFull.signal(); return item; } finally { lock.unlock(); } } }
Pendekatan ini menggunakan kunci dan syarat untuk penyelarasan benang yang lebih baik.
Pertimbangkan Antara Muka BlockingQueue
Jika anda memerlukan baris gilir menyekat, pertimbangkan untuk menggunakan pelaksanaan antara muka Java BlockingQueue, yang menyediakan pelaksanaan standard dengan thread-safe dan operasi terkawal kapasiti.
Atas ialah kandungan terperinci Bagaimanakah Kaedah `wait()` dan `notify()` Java Boleh Digunakan untuk Melaksanakan Baris Menyekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!