阻塞queue系列之ArrayBlockingQueue

来源:互联网 发布:福州广电网络 编辑:程序博客网 时间:2024/05/01 23:56

extends AbstractQueueimplements BlockingQueue, java.io.Serializable一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。添加和删除使用的是同一把锁ReentrantLock。造成在存取两种操作时会竞争同一把锁,而使得性能相对低下。

特点

  1. 有界
  2. FIFO(先进先出)
  3. Once created, the capacity cannot be changed.

构造方法

public ArrayBlockingQueue(int capacity) {        this(capacity, false);    }
public ArrayBlockingQueue(int capacity, boolean fair) {        if (capacity <= 0)            throw new IllegalArgumentException();        this.items = new Object[capacity];        lock = new ReentrantLock(fair);        notEmpty = lock.newCondition();        notFull =  lock.newCondition();    }

从源码可以看出ArrayBlockingQueue的是否公平,实际是ReentrantLock的公平。

常用方法

  • offer 添加元素
    这里写图片描述
    从源码可以看出,返回类型boolean,如果容量达到满值,则无法插入,返回false.

  • add 添加元素
    这里写图片描述
    add方法其实调用就是offer方法,只是当offer方法返回false后,会抛出IllegalStateException(“Queue full”)异常。

  • put 添加元素
    这里写图片描述
    与上述方法不同的是,该方法会阻塞,直到有空间可以插入元素。

  • poll 取元素
    这里写图片描述
    这里写图片描述
    取第一个元素,并且删除。

  • peek 取元素
    这里写图片描述
    取第一个元素,不会删除

  • take 取元素
    这里写图片描述
    若没有元素会一直阻塞,再到有元素存入。

  • drainTo(Collection<? super E> c) 排干
    这里写图片描述
    把queue的元素全部移到了list集合中。
原创粉丝点击