(十五)ArrayBlockingQueue

数组实现有界阻塞队列FIFO排序添加。大小确认不变(构造函数来决定)。默认不公平,构造时可选择(fair = true)。公平性降低吞吐量,减少可变性、“不平衡性”。

(十五)ArrayBlockingQueue_第1张图片

继承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) :满等待

(十五)ArrayBlockingQueue_第2张图片
add(E e) 
(十五)ArrayBlockingQueue_第3张图片
offer(E e) 

是否null获取lock锁成功,不满调用enqueue(E e)入列的核心方法,队尾插入

(十五)ArrayBlockingQueue_第4张图片

putIndex(对尾)添加,最后用notEmptysignal()通知阻塞出列的线程(队列空,进出列阻塞)

出队

poll() : 获取并移除队列头,队列返回 null

poll(long timeout, TimeUnit unit) :同上,等待时间前等待可用元素

take() :同上,元素可用前一直等待

remove(Object o) :移除指定元素

(十五)ArrayBlockingQueue_第5张图片
poll()

队列空返回null,否则调用dequeue()获取列头元素:

(十五)ArrayBlockingQueue_第6张图片

从列头(takeIndex )取出元素,迭代器itrs不null则 take()。最后调用notFull.signal()唤醒入列线程。

(十五)ArrayBlockingQueue_第7张图片
 take()

与poll()区别count == 0 处理,poll()返回null,take()notEmpty等入列唤醒

你可能感兴趣的:((十五)ArrayBlockingQueue)