概述
BlockingQueue见名知意,即阻塞队列。它是一个线程安全的队列。
大致有两种情况:
- 队列满了,但此时还有入队操作;
- 队列空了,但此时还有出队操作。
场景分析
主要应用在生产者-消费者场景。 - 生产者生产对象,并放入阻塞队列,直至队列已满,被阻塞。
- 消费者消费对象,从阻塞队列中取,直至队列已空,被阻塞。
队列操作方法
一共有四套方法。
第一套方法:Throws Exception
如果操作不能马上执行就会抛出异常。
type | method
-| -
Insert | add(o)
Remove | remove(o)
Examine | element()
第二套方法:Special Value
如果操作不能马上执行就会返回一个特殊值。一般是true/false
type | method
-| -
Insert | offer(o)
Remove | poll()
Examine | peek()
第三套方法:Blocks
如果操作不能马上执行就会进行阻塞操作。
type | method
-| -
Insert | put()
Remove | take()
Examine | 无
第四套方法:Times Out
如果操作不能马上执行就会给定一个超时时间。如果超时时间已经过期还未执行就会返回一个特殊值。一般是true/false
type | method
-| -
Insert | offer(o,timeout,timeunit)
Remove | poll(timeout,timeunit)
Examine | 无
事件类
ArrayBlockingQueue
- 是一个有界的(容量有限,初始化时指定容量,之后不得更改)阻塞队列。
- 其内部实现为数组。
- 是以FIFO的方式存放数据。
DelayQueue
- 阻塞的对象是队列的内部元素。
- 其内部元素必须实现J.U.C中Delayed接口。Delayed接口继承了Comparable接口。说明DelayQueue中的元素需要排序。一般按照元素过期时间的优先级排序。
- 底层实现是:PriorityQueue和Lock。
- 使用场景广泛:连接的定时关闭、缓存对象、超时处理等。
LinkedBlockingQueue
- 是BlockingQueue的一种链接版本。
- 见名知意,因为使用链接,故而若初始化时指定容量则是有界队列,否则默认队列的长度可变。
- 使用链接,故底层实现是链表。
- 是以FIFO的方式存放数据。
PriorityBlockingQueue
- 见名知意,它是BlockingQueue的附加优先级的队列。
- 是一个无边界的队列,但有排序规则。
- 队列允许插入的元素为空(null)。
- 其内部元素必须实现Comparable接口。
- 队列中优先级的排序规则:通过自定义地对Comparable接口的实现来指定规则。
- 可以从PriorityBlockingQueue中获得一个迭代器(iterator),但并不保证按照队列中元素的优先级进行迭代。
SynchronousQueue
- 见名知意,即为“同步队列”。
- 队列内部仅允许容纳一个元素,即放入一个元素后只等待其被取走。
- 是一个无界非缓存队列。