J.U.C之BlockingQueue

概述

BlockingQueue见名知意,即阻塞队列。它是一个线程安全的队列。
大致有两种情况:

  1. 队列满了,但此时还有入队操作;
  2. 队列空了,但此时还有出队操作。

    场景分析

    主要应用在生产者-消费者场景。
  3. 生产者生产对象,并放入阻塞队列,直至队列已满,被阻塞。
  4. 消费者消费对象,从阻塞队列中取,直至队列已空,被阻塞。

队列操作方法

一共有四套方法。

图示

第一套方法: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
  1. 是一个有界的(容量有限,初始化时指定容量,之后不得更改)阻塞队列。
  2. 其内部实现为数组。
  3. 是以FIFO的方式存放数据。
DelayQueue
  1. 阻塞的对象是队列的内部元素。
  2. 其内部元素必须实现J.U.C中Delayed接口。Delayed接口继承了Comparable接口。说明DelayQueue中的元素需要排序。一般按照元素过期时间的优先级排序。
  3. 底层实现是:PriorityQueue和Lock。
  4. 使用场景广泛:连接的定时关闭、缓存对象、超时处理等。
LinkedBlockingQueue
  1. 是BlockingQueue的一种链接版本。
  2. 见名知意,因为使用链接,故而若初始化时指定容量则是有界队列,否则默认队列的长度可变。
  3. 使用链接,故底层实现是链表。
  4. 是以FIFO的方式存放数据。
PriorityBlockingQueue
  1. 见名知意,它是BlockingQueue的附加优先级的队列。
  2. 是一个无边界的队列,但有排序规则。
  3. 队列允许插入的元素为空(null)。
  4. 其内部元素必须实现Comparable接口。
  5. 队列中优先级的排序规则:通过自定义地对Comparable接口的实现来指定规则。
  6. 可以从PriorityBlockingQueue中获得一个迭代器(iterator),但并不保证按照队列中元素的优先级进行迭代。
SynchronousQueue
  1. 见名知意,即为“同步队列”。
  2. 队列内部仅允许容纳一个元素,即放入一个元素后只等待其被取走。
  3. 是一个无界非缓存队列。
SupriseMF wechat
欢迎关注微信订阅号【星球码】,分享学习编程奇淫巧技~
喜欢就支持我呀(*^∇^*)~

热评文章