并发容器
阻塞队列介绍
在所有并发容器中,BlockingQueue是最常见的一种。BlockingQueue是一个带阻塞功能的队列,当入队列时,若队列已满,则阻塞调用者;当出队列时,若队列为空,则阻塞调用者。
在Concurrent包中,BlockingQueue是一个接口,有许多个不同的实现类,如图所示:
队列类型
- 无界队列(unbounded queue)——几乎可以无限增长
- 有限队列(bounded queue)——定义了最大容量
队列数据结构
队列实质就是一种存储数据的结构
- 通常用链表或者数组实现
- 一般而言队列具备FIFO先进先出的特性,当然也有双端队列(Deque)优先级 队列
- 主要操作:入队(EnQueue)与出队(Dequeue)
常见的四种阻塞队列
- ArrayBlockingQueue 由数组支持的有界队列
- LinkedBlockingQueue 由链接节点支持的可选有界队列
- PriorityBlockingQueue 由优先级堆支持的无界优先级队列
- DelayQueue 由优先级堆支持的、基于时间的调度队列
BlockingQueue接口的定义
public interface BlockingQueue<E> extends Queue<E> {
//这三个方法是用来向队列添加元素的
//非阻塞,当队列满会抛出异常
boolean add(E e);
//非阻塞,当队列满会直接返回false
boolean offer(E e);
//阻塞
void put(E e) throws InterruptedException;
//这三个方法是从队列获取元素的
//非阻塞式的
boolean remove(Object o);
//阻塞的
E take() throws InterruptedException;
//阻塞
E poll(long timeout, TimeUnit unit) throws InterruptedException;
}
ArrayBlockingQueue
介绍
ArrayBlockingQueue基于数组实现,容量大小在创建对象时已定义好。
应用场景
在线程池中有比较多的应用,生产者消费者场景
大致原理
基于ReentrantLock保证线程安全,根据Condition实现队列满时的阻塞