数组实现有界阻塞队列。FIFO排序添加。大小确认不变(构造函数来决定)。默认不公平,构造时可选择(fair = true)。公平性降低吞吐量,减少可变性、“不平衡性”。
继承AbstractQueue(对queue操作骨干实现,继承java.util.Queue),实现BlockingQueue阻塞队列核心接口,提供多线程出、入列操作
可重入锁ReentrantLock + Condition完成并发
items,定长数组,维护ArrayBlockingQueue元素
takeIndex,int,为ArrayBlockingQueue对首位置
putIndex,int,ArrayBlockingQueue对尾位置
count,元素个数
lock,锁,出入列公用锁
notEmpty,出列条件
notFull,入列条件
入队
ArrayBlockingQueue提供了诸多方法,可以将元素加入队列尾部。
add(E e) :插到尾部(如果立即可行且不会超过该队列的容量),成功返回 true,满抛 IllegalStateException
offer(E e) :同上,满返回 false; offer(E e, long timeout, TimeUnit unit) :满,等待时间前等可用空间; put(E e) :满等待
是否null,获取lock锁成功,不满调用enqueue(E e)入列的核心方法,队尾插入
putIndex(对尾)添加,最后用notEmpty的signal()通知阻塞在出列的线程(队列空,进出列阻塞)
出队
poll() : 获取并移除队列头,队列空返回 null
poll(long timeout, TimeUnit unit) :同上,等待时间前等待可用元素
take() :同上,元素可用前一直等待
remove(Object o) :移除指定元素
队列空返回null,否则调用dequeue()获取列头元素:
从列头(takeIndex )取出元素,迭代器itrs不null则 take()。最后调用notFull.signal()唤醒入列线程。
与poll()区别count == 0 处理,poll()返回null,take()notEmpty等入列唤醒