public void put(E e) throws InterruptedException {
Objects.requireNonNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);// 存入队列
} finally {
lock.unlock();
}
}
private void enqueue(E x) {
// assert lock.getHoldCount() == 1;
// assert items[putIndex] == null;
final Object[] items = this.items;// 获取到队列数组
items[putIndex] = x;// 存入指定位置,位置为队尾
if (++putIndex == items.length) putIndex = 0;// 如果putIndex指定为队尾, 那么回归回队首
count++;//计数加一
notEmpty.signal();//通知消费者队列取出数据
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
return dequeue();
} finally {
lock.unlock();
}
}
private E dequeue() {
// assert lock.getHoldCount() == 1;
// assert items[takeIndex] != null;
final Object[] items = this.items;// 获取队列数组
@SuppressWarnings("unchecked")
E x = (E) items[takeIndex];// 拿到队首的数据
items[takeIndex] = null;//指定位置置空
if (++takeIndex == items.length) takeIndex = 0;//如果takeIndex指定为length - 1,说明当前的队首就是length - 1(这之前的数据已经取出了)
count--;//计数减一
if (itrs != null)
itrs.elementDequeued();
notFull.signal();//通知生产者端存入数据
return x;//返回队首对象
}
ArrayBlockingQueue先进先出的原则对元素进行排序
最新推荐文章于 2023-10-23 09:20:38 发布