队列
- 队列是一种存储数据的结构,遵循FIFO原则,FIFO是什么意思?First In First Out。先进先出, 经典的FIFO就是BlockingQueue(阻塞队列)了
- 通常队列都是由链表或者数组来实现
- 一般队列具备FIFO,当然也有Deque(双端队列)double-ended queue
- 队列的主要操作主要有Enqueue(入列操作)和Dequeue(出列操作)
阻塞队列类型
- 有限队列 bounded queue 定义了边界也就是最大容量
- 无限队列 unbounded queue 没有定义边界,记录无限大
BlockingQueue队列的特点
- BlockingQueue不接受空元素。实现在尝试添加、放置或提供null时抛出NullPointerException。null用作标记值以指示 轮询 操作失败。
- BlockingQueue可能是有容量限制的。在任何给定时间,它都可能有一个remainingCapacity,超过该容量就不能在不阻塞的情况下放置其他元素。没有任何内在容量限制的BlockingQueue始终报告Integer.MAX_VALUE的剩余容量。
- BlockingQueue实现主要用于生产者-消费者队列,但还支持该Collection接口。因此,例如,可以使用remove(x)从队列中删除任意元素。但是,此类操作通常
不会非常有效地执行,并且仅供偶尔使用,例如取消排队的消息时。 - BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,批量集合操作addAll,containsAll,retainAll和removeAll不一定以原子方式执行,除非在实现中另有说明。因此,例如:
addAll©在仅添加c中的一些元素后可能会失败(抛出异常)。 - BlockingQueue本质上不支持任何类型的“关闭”或“关闭”操作来指示不再添加任何项目。此类功能的需求和使用往往取决于实现。例如,一种常见的策略是生产者插入特殊的流结束或有毒对象,消费者在获取时会相应地进行解释。
应用类型
BlockingQueue是一个接口, 常用的实现类有以下几种.
- ArrayBlockingQueue 由数组支持的有界队列
- LinkedBlockingQueue 由链接节点支持的可选有界队列
- PriorityBlockingQueue 由优先级堆支持的无界优先级队列
- DelayQueue 由优先级堆支持的、基于时间的调度队列
示例: 生产者消费者场景
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
常用方法
方法分类
- 添加类方法
- add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
- offer 添加一个元素并返回true 如果队列已满,则返回false
- put 添加一个元素 如果队列满,则阻塞
- 删除类方法
- remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
- poll 移除并返问队列头部的元素 如果队列为空,则返回null
- take 移除并返回队列头部的元素 如果队列为空,则阻塞
- 查询类方法
- element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
- peek 返回队列头部的元素 如果队列为空,则返回nul