首页 > 代码库 > ArrayBlockingQueue
ArrayBlockingQueue
ArrayBlockingQueue是阻塞队列的一种,基于数组实现,长度固定,队尾添加,队首获取,
构造函数:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>ArrayBlockingQueue(int capacity)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>ArrayBlockingQueue(int capacity, boolean fair)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
其中capacity为队列的容量,初始化后不可变化。
fair表示多线程操作时是否排队,默认为false,即不保证等待最久的线程优先唤醒。
public方法:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>boolean add(E e) 在队尾添加,若队列已满则抛出异常,成功返回true
void put(E e) 在队尾添加,成功返回true,队列已满则等待
boolean offer(E e) 在队尾添加,成功返回true,队列已满返回false
boolean offer(E e, long timeout, TimeUnit unit) 在队尾添加,成功返回true,队列已满等待时间为timeout
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }</style><style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }</style>
E take() 从队首取元素,如果队列为空,则等待;
E peek() 获取队首元素,若成功,则返回队首元素;否则返回null
E poll() 移除并获取队首元素,若成功,则返回队首元素;否则返回null
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>E poll(long timeout, TimeUnit unit) 移除并获取队首元素,队列已满等待时间为timeout
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 }</style>
int size() 返回已使用空间大小
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 }</style>int remainingCapacity() 返回剩余空间大小
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>boolean remove(Object o) 移除一个equals(o)的元素
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>boolean contains(Object o) 返回是否包含equals(o)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 }</style>void clear() 清空队列
实现原理:
--------put
public void put(E e) throws InterruptedException { checkNotNull(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) { final Object[] items = this.items; items[putIndex] = x; if (++putIndex == items.length) putIndex = 0; count++; notEmpty.signal(); }
--------
首先元素判空,然后获取了单线程可中断锁,然后判断队列是否已满,是则notFull状态等待,否则放入元素并激活等待notEmpty状态的线程,最后解锁。
-------take
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() { final Object[] items = this.items; @SuppressWarnings("unchecked") E x = (E) items[takeIndex]; items[takeIndex] = null; if (++takeIndex == items.length) takeIndex = 0; count--; if (itrs != null) itrs.elementDequeued(); notFull.signal(); return x; }
-------
首先获取可中断锁,然后判断队列中是否为空,是则notEmpty状态等待,否则取出元素并激活等待notFull状态的线程,最后解锁。
一个例子:
------
------
1
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #7e504f }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { color: #931a68 } span.s2 { color: #7e504f }</style>ArrayBlockingQueue