目 录CONTENT

文章目录

ArrayBlockingQueue - 基于数组的有界阻塞队列

FatFish1
2024-10-24 / 0 评论 / 0 点赞 / 72 阅读 / 0 字 / 正在检测是否收录...

概述

一个用数组实现的有界阻塞队列,会自动阻塞,此队列按照先进先出FIFO原则对元素进行排序。支持公平锁和非公平锁。提供方法包括:

  • boolean add(E e):在容量不足时,抛出异常。

  • void put(E e):在容量不足时,阻塞等待。

  • boolean offer(E e):不阻塞,容量不足时返回false,当前新增数据操作放弃。

  • boolean offer(E e, long timeout, TimeUnit unit):容量不足时,阻塞times时长(单位为timeunit),如果在阻塞时长内,有容量空闲,新增数据返回true。如果阻塞时长范围内,无容量空闲,放弃新增数据,返回false。

  • int drainTo():将队列中的多个元素转移到指定的集合中,如果队列为空,则不执行任何操作。如果队列中有null,则转移null值;如果指定集合容量不足,则只转义部分;每次调用后原队列元素被移除

构造函数

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();
}

从构造函数可以看出来,一个ReentrantLock是阻塞实现的核心,其构造了两个Condition,一个代表队满,一个代表队空

传入了一个capacity,通过这个值构造数组,表示这个队列的长度。

0

评论区