顾名思义,ArrayBlockingQueue是基于数组实现的有界阻塞队列。该队列对元素进行FIFO排序。队列的首元素是在该队列中驻留时间最长的元素。队列的尾部是在该队列中停留时间最短的元素。新的元素被插入到队列的尾部,队列检索操作获取队列头部的元素。
ArrayBlockingQueue是一个经典的“有界缓冲区(bounded buffer)”,其中内部包含了一个固定大小的数组,用于承载包含生产者插入的和消费者提取的元素。ArrayBlockingQueue的容量一旦创建,不可更改。试图将一个元素放入一个满队列将导致操作阻塞;试图从空队列中取出一个元素也同样会阻塞。
ArrayBlockingQueue支持排序的可选公平策略,用于等待生产者和消费者线程。默认情况下,不保证此顺序。然而,一个由公平性设置为true构造的队列允许线程以FIFO顺序访问。公平性一般会降低吞吐量,但可以减少可变性,避免线程饿死。
ArrayBlockingQueue类及其迭代器实现了Collection和Iterator接口的所有可选方法。ArrayBlockingQueue是Java Collections Framework的一个成员。
1. ArrayBlockingQueue的声明
ArrayBlockingQueue的接口和继承关系如下
public class ArrayBlockingQueue extends AbstractQueue
implements BlockingQueue, java.io.Serializable {
…
}
完整的接口继承关系如下图所示。
从上述代码可以看出,ArrayBlockingQueue既实现了BlockingQueue和java.io.Serializable接口,又继承了java.util.AbstractQueue。其中,AbstractQueue是Queue接口的抽象类,核心代码如下。
package java.util;
public abstract class AbstractQueue
extends AbstractCollection
implements Queue {
protected AbstractQueue() {
}
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
public E remove() {
E x = poll();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
public E element() {
E x = peek();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
public void clear() {
while (poll() != null)
;
}
public boolean addAll(Collection
- 【Java 数据结构及算法实战】系列 015:HJ1 字符串最后一个单词的长度
- Vue 3系列之04——Vue 3组件与Web组件的异同点
- 【Java 数据结构及算法实战】系列 013:Java队列07——双端队列Deque
- 【Java数据结构及算法实战】系列011:数组实现的优先级队列PriorityQueue
- 【Java数据结构及算法实战】系列010:Java队列04——链表实现的阻塞队列LinkedBlockingQueue
- HarmonyOS初探06——使用DevEco Studio模拟器端口被占用无法启动
- 【Java数据结构及算法实战】系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue
- HarmonyOS初探04——使用DevEco Studio时设置Gradle仓库镜像
- 【Java数据结构及算法实战】系列008:Java队列02——阻塞队列BlockingQueue
- 鸿蒙新作《鸿蒙HarmonyOS应用开发从入门到精通》拆箱