首页 > Java > java教程 > 如何使用Java的`wait()`和`notify()`方法来实现阻塞队列?

如何使用Java的`wait()`和`notify()`方法来实现阻塞队列?

Barbara Streisand
发布: 2024-11-23 09:42:31
原创
723 人浏览过

How Can Java's `wait()` and `notify()` Methods Be Used to Implement a Blocking Queue?

在 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;
    }
}
登录后复制

工作原理

  • Put() 方法:如果队列已满,当前线程会等待,直到收到空间可用的通知。
  • Take() 方法: 如果队列为空,当前线程会等待,直到收到元素可用的通知。

注意: 确保 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板