首页 > Java > java教程 > 如何使用 wait() 和 notify() 在 Java 中实现阻塞队列?

如何使用 wait() 和 notify() 在 Java 中实现阻塞队列?

Patricia Arquette
发布: 2024-12-29 06:12:16
原创
875 人浏览过

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

使用wait()和notify()实现阻塞队列

简介

在多线程编程中,wait()和notify()是用于线程同步。本文介绍如何使用 wait() 和 notification() 实现阻塞队列,这是一种允许线程阻塞直到有项可用或空间可用的数据结构。

使用 wait( 实现阻塞队列) 和 notification()

条件阻塞:

  • put() 方法: 阻塞,直到队列中有可用空间。
  • take() 方法: 阻塞,直到有可用的元素为止

Java代码:

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

使用wait()和notify()时的注意事项

  • 同步代码:在同步方法中调用wait()和notify()或者
  • While 循环: 使用 while 循环而不是 if 语句来检查由于虚假唤醒而导致的条件。

Java 1.5 并发库

Java 1.5引入了一个并发库,提供了更高级别的抽象:

修改后的阻塞队列实现:

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

以上是如何使用 wait() 和 notify() 在 Java 中实现阻塞队列?的详细内容。更多信息请关注PHP中文网其他相关文章!

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