阻塞队列

使用场景

生产者消费者:阻塞队列是一个 fifo 的队列,所以对于希望在线程级别需要实现对目标服务的顺序访问的场景中。在 Java8 中,提供了 7 个阻塞队列

特点

  1. 队列满时,入队线程会被堵塞
  2. 队列空时,出对线程会被堵塞

实现

  1. ArrayBlockingQueue:数组实现的有界阻塞队列, 此队列按照先进先出(FIFO)的原则对元素进行排序。
  2. LinkedBlockingQueue:链表实现的有界阻塞队列, 此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。
  3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列, 默认情况下元素采取自然顺序升序排列。也可以自定义类实现 compareTo()方法来指定元素排序规则,或者初始化 PriorityBlockingQueue 时,指定构造参数 Comparator 来对元素进行排序。
  4. DelayQueue:优先级队列实现的无界阻塞队列。
  5. SynchronousQueue:不存储元素的阻塞队列, 每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。
  6. LinkedTransferQueue:链表实现的无界阻塞队列。
  7. LinkedBlockingDeque:链表实现的双向阻塞队列。

操作方法

操作

Throws Exception

Special Value

Blocks

Times Out

添加

add(o)

offer(o)

put(o)

offer(o,timeout,timeunit)

移除

remove(o)

poll()

take()

poll(timeout,timeunit)

检查

element()

peek()

  1. 插入元素操作
// 添加元素到队列中,如果队列满了,继续插入元素会报错,IllegalStateException
add(o);
// 添加元素到队列,同时会返回元素是否插入成功的状态,如果成功则返回 true
offer(o);
// 当阻队列满了以后,生产者继续通过 put添加元素,队列会一直阻塞生产者线程
put(o)
// 当阻塞队列满了以后继续添加元素,生产者线程会被阻塞指定时间,如果超时,则线程直接退出
offer(o,timeout,timeunit);
  1. 删除/获取元素操作
// 当队列为空时,调用 remove 会返回 false,如果元素删除成功,则返回 true
remove(o);
// 当队列中存在元素,则从队列中取出一个元素,如果队列为空,则直接返回 null
poll();
// 基于阻塞的方式获取队列中的元素,如果队列为空,则一直阻塞,直到队列中有新的数据可以消费
take();
// 带超时机制的获取数据,如果队列为空,则会等待指定的时间再去获取元素返回
poll(timeout,timeunit);