自己动手实现BlockingQueue

本文探讨了Java中的ArrayBlockingQueue,并重点介绍了其take和put方法在并发场景下的应用。ArrayBlockingQueue是一个循环队列,当队列为空或满时,会使得线程进入等待状态。作者分享了自己的实现,关注于生产者-消费者模型的核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Java的java.util.concurrent.*包下有许多在并发场景下使用的集合,ArrayBlockingQueue是其中之一,它是一个循环队列,这个队列的特别之处在于take方法与put方法,分别对应队列的元素出列和元素入列操作,当队列为空时,take会使得线程进入等待状态,直到队列不为空,有元素能够出列才会继续执行;同理,当队列满时,put方法也会使得线程进入等待状态。

    实际上这是一个生产者-消费者模型,按照理解, 自己也试着实现了一个,代码如下

/**
 * Created by YotWei on 2018/7/1.
 */
public class BlockingQueue<E> {

    /**
     * 有界队列内部固定长度,因此可以用数组实现
     */
    private Object[] elements;

    /**
     * 队列的头和尾下标
     */
    private int head = 0, tail = 0;

    /**
     * 队列目前的长度
     */
    private int size;

    private ReentrantLock lock = new ReentrantLock();

    private Condition notEmpty = lock.newCondition();

    private Condition notFull = lock.newCondition();

    public BlockingQueue(int capacity) {
        this.elements = new Object[capacity];
    }

    public void put(E e) {
        lock.lock();
        try {
            while (size == elements.length)
                notFull.await();
            elements[tail] = e;
            if (++tail == elements.length) {
                tail = 0;
            }
            size++;
            notEmpty.signal();

        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public E take() {
        lock.lock();
        E e = null;
        try {
            while (size == 0) {
                notEmpty.await();
            }
            e = (E) elements[head];
            elements[head] = null;
            if (++head == elements.length)
                head = 0;
            size--;
            notFull.signal();

        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } finally {
            lock.unlock();
        }
        return e;
    }

    public int size() {
        lock.lock();
        try {
            return size;
        } finally {
            lock.unlock();
        }
    }
}

    实际上ArrayBlockingQueue还包含许多其它方法,这两个是最核心的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值