欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阻塞queue系列之ArrayBlockingQueue

程序员文章站 2022-06-08 08:10:18
...

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 添加元素
    阻塞queue系列之ArrayBlockingQueue
    从源码可以看出,返回类型boolean,如果容量达到满值,则无法插入,返回false.

  • add 添加元素
    阻塞queue系列之ArrayBlockingQueue
    add方法其实调用就是offer方法,只是当offer方法返回false后,会抛出IllegalStateException(“Queue full”)异常。

  • put 添加元素
    阻塞queue系列之ArrayBlockingQueue
    与上述方法不同的是,该方法会阻塞,直到有空间可以插入元素。

  • poll 取元素
    阻塞queue系列之ArrayBlockingQueue
    阻塞queue系列之ArrayBlockingQueue
    取第一个元素,并且删除。

  • peek 取元素
    阻塞queue系列之ArrayBlockingQueue
    取第一个元素,不会删除

  • take 取元素
    阻塞queue系列之ArrayBlockingQueue
    若没有元素会一直阻塞,再到有元素存入。

  • drainTo(Collection<? super E> c) 排干
    阻塞queue系列之ArrayBlockingQueue
    把queue的元素全部移到了list集合中。
相关标签: queue