首页 > 代码库 > 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