阻塞队列之设计思想
阻塞队列最初来源于生产者消费者的使用场景,生产者需要往队列里面放数据,消费者需要从队列里面获取消息。后来使用场景的丰富,需要这种队列支持更为丰富的操作,比如非阻塞式获取和消费消息等。于是就诞生了如今标准的阻塞队列,JDK里面帮我们提供了丰富的组队列,开发者只要明白其原理,合理使用便可。
- 阻塞队列需要支持的操作
| 方法 | 抛出异常 | 返回特殊值 | 阻塞 | 阻塞超时退出 |
|---|---|---|---|---|
| 插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
| 删除 | remove() | poll() | take() | poll(time, unit) |
| 查看 | element() | peek() | None | None |
抛出异常: 如果往队列里面放置元素,队列已经满了,则抛出IllegalStateException;如果从队列里面获取元素,当队列为空时,就抛出NoSuchElementException。
返回特殊值: 如果队列已满,往队列里面放置数据,返回false;如果空队列,从队列里面获取元素,返回null。
阻塞: 线程往满队列里面放置数据,将会被阻塞,直到队列不再是满队列状态,或者响应中断退出。线程从空队列里面获取数据,将会被阻塞,知道队列里面有元素,或者响应中断退出。
阻塞超时退出: 会在阻塞队列上阻塞一定的时间,然后超过设定时间则退出。
- jdk中为我们准备好7个阻塞队列
ArrayBlockingQueue: 一个由数组结构构成的有界阻塞队列
LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列
PriorityBlockingQueue: 一个支持优先级排序的阻塞无界阻塞队列
DelayQueue: 一个使用PriorityBlockingQueue实现的支持时延的无界阻塞队列
SynchronousQueue: 一个不存储元素的阻塞队列
TransferedBlockingQueue: 一个由链表结构组成的无界阻塞队列
TransferedBlockingDequeue: 一个由链表结构组成的双向阻塞队列
本文深入探讨了阻塞队列的设计理念及其在生产者消费者模式中的关键作用。介绍了阻塞队列所需支持的基本操作,包括插入、删除、查看等,并详细解释了异常处理、阻塞及超时退出机制。同时,列举并解析了JDK中提供的7种阻塞队列类型,如ArrayBlockingQueue、LinkedBlockingQueue和PriorityBlockingQueue等。

被折叠的 条评论
为什么被折叠?



