在Java 中使用Wait() 和Notify():帶有隊列的場景
問題:
您能否提供有關如何實現wait() 和notify()方法的全面演練有隊列嗎?
答案:
Wait()和Notify()原理
Wait()和notify () 透過讓執行緒在繼續之前等待滿足特定條件來啟用線程協調。在本例中,我們有興趣建立一個強制執行容量限制的阻塞佇列。
實作
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; } }
工作原理
注意: 確保 wait() 和 notification() 呼叫同步在同一物件上並放置在 while 迴圈中以處理虛假喚醒。
Java 1.5 並發功能
Java 1.5 引入了 java.util.concurrent 套件,為執行緒協調提供更高層級的抽象。以下是此範例的更新版本:
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(); } } }
此方法使用鎖定和條件來改善執行緒協調。
考慮 BlockingQueue 介面
如果您需要阻塞佇列,請考慮使用 Java BlockingQueue 介面的實現,它提供了執行緒安全和容量控制的標準實作操作。
以上是如何使用Java的`wait()`和`notify()`方法來實作阻塞佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!