数据结构-阻塞队列
参考文献
什么是队列
- 队列是一种特殊的线性表;
- 特殊之处在于,它只允许在表的前端(Front)进行删除操作,在表的后端(Rear)进行插入操作;
- 和栈一样是一种操作受限的线性表;
- 是一种先进先出(FIFO的数据结构;
什么是阻塞队列
- 当队列为空时,消费者挂起,队列已满是,生产者挂起,这就是生产者-消费者模型,阻塞就是将线程挂起.若生产者的生产速度和消费者速度之间不匹配,就可以通过阻塞队列让速度快的暂时阻塞.
- 阻塞队列会通过挂起的方式来实现生产者和消费者之间的平衡,这是和普通队列最大的区别;
Java中的阻塞队列java.util.concurrent.BlockingQueue
Throws Exception | Special Value | Blocks | Times Out | |
---|---|---|---|---|
Insert | add(e) | offer(e) | put(e) | offer(e,time,unit) |
Remove | remove(e) | poll() | take() | poll(time,unit) |
Examine | element() | peek() |
offer(E e)
: 若队列没满,返回true,如果队列已满,返回false(不阻塞);offer(E e,long timeout,TimeUnit unit)
: 可以设置等待时间,若队列没满,则进行等待,超过等待时间,则返回false(不阻塞);put(E e)
: 无返回值,一直等待,直至队列空出位置;poll()
: 若有数据,出队,若没有数据,返回null;poll(long timeout,TimeUnit unit)
: 可以设置等待时间,若没有数据,则等待,超过等待时间,则返回null;take()
: 若有数据,出队,若没有数据,一直等待;
BlockingQueue
主要实现类
ArrayBlockingQueue
- 基于数组实现的,通过初始化时设置数组长度,是一个有界队列;
LinkedBlockingQueue
- 基于链表实现,大小可以初始化设置,若不设置默认为
Integer.MAX_VALUE
- 基于链表实现,大小可以初始化设置,若不设置默认为
DelayQueue
- 基于优先级的一个无界队列,队列元素必须实现
Delayed
接口,支持延迟获取,元素按照时间排序,只有元素到期后,消费者才能从队列中取出;
- 基于优先级的一个无界队列,队列元素必须实现
PriorityBlockingQueue
- 基于优先级的一个无界队列,底层是基于数组存储元素,元素按照优先级顺序存储,优先级是通过
Comparable
的compareTo
方法实现(自然排序),和其他阻塞队列不同的是,其只会阻塞消费者,不会则是生产者,数组会不断扩容;
- 基于优先级的一个无界队列,底层是基于数组存储元素,元素按照优先级顺序存储,优先级是通过
SynchronousQueue
- 是一个特殊的队列,其内部没有容器,所以生产者必须生成一个数据,生产者才能再次生成;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!