当前位置: 首页 > news >正文

多线程JUC 第2季 BlockingQueue 阻塞队列

一 阻塞队列

1.1 阻塞队列介绍

阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列:

put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。

take方法:当队列为空时,消费的线程则被阻塞,直到队列不空时,则可用。

阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度给降下来。实现阻塞最重要的两个方法是 take 方法和 put 方法。

根据容量的大小,分为有界和无界两种。

总结:当队列满了无法添加元素,或者是队列空了无法移除元素时

1.2 阻塞的put与take方法逻辑

1.2.1 put方法

1) offer(E e):如果队列没满,返回true,如果队列已满,返回false(不阻塞)

2)offer(E e, long timeout, TimeUnit unit):可以设置阻塞时间,如果队列已满,则进行阻塞。超过阻塞时间,则返回false

3)put(E e):队列没满的时候是正常的插入,如果队列已满,则阻塞,直至队列空出位置

put 方法

  • put 方法插入元素时,如果队列没有满,那就和普通的插入一样是正常的插入
  • 但是如果队列已满,那么就无法继续插入,则阻塞,直到队列里有了空闲空间
  • 如果后续队列有了空闲空间,比如消费者消费了一个元素,那么此时队列就会解除阻塞状态,并把需要添加的数据添加到队列中

  1. 抛出异常:add、remove、element
  2. 返回结果但不抛出异常:offer、poll、peek
  3. 阻塞:put、take
方法抛出异常返回特定值阻塞阻塞特定时间
入队add(e)offer(e)put(e)offer(e, time, unit)
出队remove()poll()take()poll(time, unit)
获取队首元素element()peek()不支持不支持

1.3 常见的api

BlockingQueue 接口的实现类都被放在了 juc 包中。

http://www.lryc.cn/news/355143.html

相关文章:

  • 【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索
  • 【面试必看】Java并发
  • C++的第一道门坎:类与对象(一)
  • 经典面试题:MySQL如何调优?
  • 【程序员如何送外卖】
  • 【git pull 和 push详解】
  • 数据挖掘导致直接路径读(direct path read)耗尽了IO
  • 用队列实现栈 用栈实现队列 设计循环队列
  • BFS解决最短路问题(详解)
  • 按尺寸筛选轮廓图中的轮廓
  • VBA高级应用30例:实现在列表框内及列表框间实现数据拖动
  • 「AIGC算法」R-tree算法
  • 2024软考上半年嵌入式系统设计师考试回顾
  • MIT6.828 Lab2-1 Using gdb
  • mysqldump提示Using a password on the command line interface can be insecured的解决办法
  • Java毕业设计 基于springboot vue考勤管理系统
  • C数据结构:二叉树
  • 使用Nginx作为反向代理实现MQTT内外网通信
  • SpringBoot 上传文件示例
  • 9.js函数
  • 关于数据库和数据表的基础SQL
  • 【C语言深度解剖】(14):结构体内存对齐(详细配图讲解)
  • 学习笔记:C语言的32个关键字
  • 嵌入式学习 (Day:27 IPC --- 进程间通信)
  • Python考试复习--day2
  • 整理好了!2024年最常见 20 道 Redis面试题(九)
  • IDEA使用Maven打包项目的所有的依赖
  • 【C++ 】学习问题及补充
  • 内存泄漏案例分享3-view的内存泄漏
  • 红外超声波雷达测距