在 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中文网其他相关文章!