本日我们来聊一聊以数组为数据结构的壅闭队列 ArrayBlockingQueue,它实现了 BlockingQueue 接口,继续了抽象类 AbstractQueue。
BlockingQueue 提供了三个元素入队的方法。
boolean add(E e);boolean offer(E e);void put(E e) throws InterruptedException; | 三个元素出队的方法。
E take() throws InterruptedException;E poll(long timeout, TimeUnit unit) throws InterruptedException;boolean remove(Object o); | 一起来看看,ArrayBlockingQueue 是如何实现的吧。
初识
首先看一下 ArrayBlockingQueue 的主要属性和构造函数。
属性
//存放元素final Object[] items; //取元素的索引int takeIndex;//存元素的索引int putIndex;//元素的数量int count;//控制并发的锁final ReentrantLock lock;//非空条件信号量private final Condition notEmpty;//非满条件信号量private final Condition notFull;transient Itrs itrs = null; | 从以上属性可以看出:
- 以数组的方式存放元素。
- 用 putIndex 和 takeIndex 控制元素入队和出队的索引。
- 用重入锁控制并发、包管线程的安全。
构造函数
ArrayBlockingQueue 有三个构造函数,此中 <span style="color: #555555; --tt-darkmode-color: #919191;"><span style="background-color: #EEEEEE; --tt-darkmode-bgcolor: #232323;">public ArrayBlockingQueue(int capacity, boolean fair, Collection |