队列Queue-04

举报
kwan的解忧杂货铺 发表于 2024/08/04 23:19:53 2024/08/04
【摘要】 1.BlockingQueue 接口定义阻塞队列:BlockQueue 满了,PUT 操作被阻塞BlockQueue 为空,Take 操作被阻塞阻塞队列为空的情况:BlockingQueue(阻塞队列)也是一种队列,支持阻塞的插入和移除方法。阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。阻塞的移除:当队列为空,获取元素的线程会等待队列变为非空。应用场景:生产者和消费者,生...

1.BlockingQueue 接口定义

阻塞队列:

  • BlockQueue 满了,PUT 操作被阻塞
  • BlockQueue 为空,Take 操作被阻塞

阻塞队列为空的情况:

  1. BlockingQueue(阻塞队列)也是一种队列,支持阻塞的插入和移除方法。
  2. 阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
  3. 阻塞的移除:当队列为空,获取元素的线程会等待队列变为非空。
  4. 应用场景:生产者和消费者,生产者线程向队列里添加元素,消费者线程从队列里移除元素,阻塞队列时获取和存放元素的容器。
  5. 为什么要用阻塞队列:生产者生产和消费者消费的速率不一样,需要用队列来解决速率差问题,当队列满了或空的时候,则需要阻塞生产或消费动作来解决队列满或空的问题。

2.BlockingQueue 核心方法

BlockingQueue 接口的 10 个核心方法:

image.png

3.十个核心方法总结如下

BlockingQueue接口的10个核心方法:

有三大类操作:插入、移除、检查。

  • 插入有四种方法: add、offer、put、offer 超时版。
    • IllegalStateException - 队列满了
    • ClassCastException - 添加的元素类型不匹配
    • NullPointerException - 添加的元素为 null
    • IllegalArgumentException - 添加的元素某些属性不匹配
    • add 方法特别之处用于添加失败时抛出异常,共有四种异常:
    • offer 方法特别之处用于添加失败时只返回 false
    • put 方法特别之处用于当阻塞队列满时,生产者如果往队列里 put 元素,则队列会一直阻塞生产者线程,直到队列可用或者响应中断退出
    • offer 超时方法特别之处用于当阻塞队列满时,生产者如果往队列里面插入元素,队列会阻塞生产者线程一段时间,如果超过了指定时间,生产者线程会退出,并返回 false。
  • 移除有四种方法: remove、poll、take、poll 超时版
    • NoSuchElementException - 如果这个队列是空的
    • remove 方法特别之处用于移除失败时抛出异常
    • poll 方法特别之处用于移除失败时返回 null
    • take 方法特别之处用于当阻塞队列为空时,消费者线程如果从队列里面移除元素,则队列会一直阻塞消费者线程,直到队列不为空
    • poll 超时方法特别之处用于当阻塞队列空时,消费者如果从队列里面删除元素,则队列会一直阻塞消费者线程,如果超过了指定时间,消费者线程会退出,并返回 null
  • 检查有两种方法: element、peek
    • element 方法用于检测头部元素的存在性,如果队列为空,则抛出异常,否则返回头部元素。
    • peek 方法用于检测头部元素的存在性,如果队列为空,返回特殊值 null,否则返回头部的元素。

4.BlockingQueue 原理

BlockingQueue 通过什么来阻塞插入和移除的?

  • 当往队列里插入一个元素时,如果队列不可用,那么阻塞生产者主要通过 LockSupport. park(this)来实现。

  • park 这个方法会阻塞当前线程,只有以下 4 种情况中的一种发生时,该方法才会返回。

    • 与 park 对应的 unpark 执行或已经执行时。“已经执行”是指 unpark 先执行,然后再执行 park 的情况。

    • 线程被中断时。

    • 等待完 time 参数指定的毫秒数时。

    • 异常现象发生时,这个异常现象没有任何原因。

5.BlockingQueue 继承与实现

哪些类继承了BlockingQueue接口:

  • BlockingDeque 接口 - 双端阻塞队列
  • TransferQueue 接口 - 传输队列

哪些类实现了BlockingQueue接口:

  • ArrayBlockingQueue 类 - 由数组构成的有界阻塞队列
  • LinkedBlockingQueue 类 - 由链表构成的有界阻塞队列,界限默认大小为 Integer.MAX_Value(2^31-1),值非常大,相当于无界。
  • LinkedBlockingDeque 类 - 由链表构成的双向阻塞队列
  • LinkedTransferQueue 类 - 由链表构成的无界阻塞队列
  • SynchronousQueue 类 - 不存储元素的阻塞队列,只有一个元素进行数据传递。
  • LinkedTransferQueue 类 - 由链表构成的无界阻塞 TransferQueue 队列
  • DelayQueue 类 - 使用优先级队列实现的延迟无界阻塞队列

6.BlockingDeque 接口方法

是阻塞队列BlockingQueue和双向队列Deque接口的结合。有如下方法:

image.png

BlockingQueue和BlockingDeque的对等方法:

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。