BlockingQueue - 阻塞队列

BlockingQueue - 阻塞队列

定义

BlockingQueue 一般用于生产者-消费者模式,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。BlockingQueue 就是存放元素的容器。

1. 常用方法

BlockingQueue - 阻塞队列
  • 抛出异常:如果操作无法立即执行,则会抛出异常。当阻塞队列满的时候,再往队里里插入元素,会抛出 Queue full 异常。当队列为空时,从队列里获取元素会抛出 NoSuchElementException 异常。

  • 返回特殊值:如果插入、删除操作成功,那么会返回结果:true、false。

  • 一直阻塞:当队列满时,执行 put 增加操作那么会阻塞;当队列为空时,执行take 移除操作,那么也会阻塞。

  • 超时退出:在 offer、poll 操作时,可以设置超时的属性,例如超时的时间、时间单位。如果在给定的时间内没有能够执行完成,那么就会返回true、false标识操作执行的状态。

不能往阻塞队列中插入 null,会抛出空指针异常。

可以访问阻塞队列中的任意元素,调用 remove(o)可以将队列之中的特定对象移除,但并不高效。

2. 具体实现类

  1. ArrayBlockingQueue

    由数组结构组成的有界阻塞队列,初始化时必须指定容量大小,默认采用的是unfair 锁。

  2. LinkedBlockingQueue

    由链表结构组成的有界阻塞队列,具有链表的特性。默认的队列的大小是Integer.MAX_VALUE,也可以指定大小。

  3. DelayQueue

    延时队列,该队列中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。其中的元素必须实现 Delayed接口,内部是一个优先级队列,没有大小限制的队列,所以 take 和 put 操作永远不会阻塞,以为内部都是调用 poll 和 offer。

  4. PriorityBlockingQueue

    基于优先级的无界队列,优先级通过判断传入构造参数中的 Compator 对象决定。因为是无界的,所以不会阻塞生产者put,但是当队列中容量为空时,则会阻塞消费者 take 操作。

版权声明:玥玥 发表于 2021-04-11 7:12:18。
转载请注明:BlockingQueue - 阻塞队列 | 女黑客导航