Dalam pengaturcaraan berbilang benang, wait() dan notify() adalah digunakan untuk penyegerakan benang. Artikel ini menerangkan cara menggunakan wait() dan notify() untuk melaksanakan baris gilir menyekat, struktur data yang membenarkan utas disekat sehingga item tersedia atau ruang tersedia.
Syarat untuk Menyekat:
Jawa Kod:
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(); // notifyAll() for multiple producer/consumer threads } public synchronized T take() throws InterruptedException { while (queue.isEmpty()) { wait(); } T item = queue.remove(); notify(); // notifyAll() for multiple producer/consumer threads return item; } }
Java 1.5 memperkenalkan perpustakaan concurrency yang menyediakan abstraksi peringkat lebih tinggi:
Baris Gilir Penyekatan Diubah Suai Pelaksanaan:
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(); } } }
Atas ialah kandungan terperinci Bagaimanakah `wait()` dan `notify()` Boleh Digunakan untuk Melaksanakan Baris Menyekat di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!