阻塞队列(1)

阻塞队列之设计思想

阻塞队列最初来源于生产者消费者的使用场景,生产者需要往队列里面放数据,消费者需要从队列里面获取消息。后来使用场景的丰富,需要这种队列支持更为丰富的操作,比如非阻塞式获取和消费消息等。于是就诞生了如今标准的阻塞队列,JDK里面帮我们提供了丰富的组队列,开发者只要明白其原理,合理使用便可。

  1. 阻塞队列需要支持的操作
方法 抛出异常 返回特殊值 阻塞 阻塞超时退出
插入 add(e) offer(e) put(e) offer(e,time,unit)
删除 remove() poll() take() poll(time, unit)
查看 element() peek() None None

抛出异常: 如果往队列里面放置元素,队列已经满了,则抛出IllegalStateException;如果从队列里面获取元素,当队列为空时,就抛出NoSuchElementException。
返回特殊值: 如果队列已满,往队列里面放置数据,返回false;如果空队列,从队列里面获取元素,返回null。
阻塞: 线程往满队列里面放置数据,将会被阻塞,直到队列不再是满队列状态,或者响应中断退出。线程从空队列里面获取数据,将会被阻塞,知道队列里面有元素,或者响应中断退出。
阻塞超时退出: 会在阻塞队列上阻塞一定的时间,然后超过设定时间则退出。

  1. jdk中为我们准备好7个阻塞队列
    ArrayBlockingQueue: 一个由数组结构构成的有界阻塞队列
    LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列
    PriorityBlockingQueue: 一个支持优先级排序的阻塞无界阻塞队列
    DelayQueue: 一个使用PriorityBlockingQueue实现的支持时延的无界阻塞队列
    SynchronousQueue: 一个不存储元素的阻塞队列
    TransferedBlockingQueue: 一个由链表结构组成的无界阻塞队列
    TransferedBlockingDequeue: 一个由链表结构组成的双向阻塞队列

猜你喜欢

转载自blog.csdn.net/chenyang1010/article/details/83050428