阻塞queue系列之ArrayBlockingQueue

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集合中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值