阻塞队列之设计思想
阻塞队列最初来源于生产者消费者的使用场景,生产者需要往队列里面放数据,消费者需要从队列里面获取消息。后来使用场景的丰富,需要这种队列支持更为丰富的操作,比如非阻塞式获取和消费消息等。于是就诞生了如今标准的阻塞队列,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: 一个由链表结构组成的双向阻塞队列