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

什么是BlockingQueue?什么是阻塞队列?它的特点是什么?阻塞队列的生产方法和消费方法有什么?

1、什么是阻塞队列?

       BlockingQueue 是 Java 并发包(java.util.concurrent)中的一个接口,表示一个线程安全的队列。 它支持生产者-消费者模式,并提供了阻塞的操作机制,允许线程在以下情况下被挂起

  •  生产者线程:当队列已满时,会阻塞直到队列有空闲空间
  •  消费者线程:当队列为空时,会阻塞直到队列中有可用数据
  •  阻塞队列是 Java 提供的高效解决线程间通信问题的重要工具

2、有哪些阻塞队列

  1. ArrayBlockingQueue(常用):固定大小的有界队列
  2. LinkedBlockingQueue(常用):可选有界或无界的链表队列
  3. PriorityBlockingQueue:按优先级排序的无界队列
  4. DelayQueue:支持延迟元素的无界队列
  5. SynchronousQueue:不存储元素的直接传递队列
  6. LinkedTransferQueue:支持高效传递的无界队列
  7. LinkedBlockingDeque:双端阻塞队列

3、BlockingQueue的核心特点

(1)线程安全:

  • 内部通过锁机制保证操作的线程安全
  • 自动处理并发访问,无需额外加锁

(2)阻塞机制:

  • 在获取元素时,如果队列为空,会阻塞线程直到队列非空
  • 在插入元素时,如果队列已满,会阻塞线程直到队列有空间

(3)支持不同的操作方式:

  • 抛出异常:如 add() 和 remove()
  • 返回特殊值:如 offer() 和 poll()
  • 阻塞操作:如 put() 和 take()
  • 超时操作:如 offer(E e, long timeout, TimeUnit unit)

3、BlockingQueue(阻塞队列)的生产方法

       生产者通过 BlockingQueue 向队列中添加元素。如果队列已满,生产者会被阻塞,直到队列中有空闲空间

常用方法

(1)put(E e)

   将元素插入队列,如果队列已满,则阻塞直到有空闲空间

BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
 queue.put(1); // 如果队列已满,则阻塞

(2)offer(E e):

   将元素插入队列,如果队列已满,则返回 false

boolean success = queue.offer(1); // 如果队列已满,返回 false

(3)offer(E e, long timeout, TimeUnit unit):

   将元素插入队列,如果队列已满,则等待指定的时间

boolean success = queue.offer(1, 5, TimeUnit.SECONDS); // 等待 5 秒

4、BlockingQueue(阻塞队列)的消费方法

       消费者通过 BlockingQueue 从队列中移除元素。如果队列为空,消费者会被阻塞,直到队列中有可用元素

常用方法

(1)take():

   移除并返回队列头部的元素,如果队列为空,则阻塞直到有可用元素

int value = queue.take(); // 如果队列为空,则阻塞

(2)poll():

   移除并返回队列头部的元素,如果队列为空,则返回 null

Integer value = queue.poll(); // 如果队列为空,返回 null

(3)poll(long timeout,TimeUnit unit):

   移除并返回队列头部的元素,如果队列为空,则等待指定的时间

Integer value = queue.poll(5, TimeUnit.SECONDS); // 等待 5 秒

(4)peek():

   返回队列头部的元素,但不移除。如果队列为空,则返回 null

Integer value = queue.peek(); // 不移除元素

http://www.dtcms.com/a/18975.html

相关文章:

  • 最佳的出牌方法
  • PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
  • [小M全新力作-修稿]PFC_LLC电源设计全攻略:从原理学习到SIMULINK仿真到EDA板实战,再到实物电源调试
  • 什么是元学习?
  • 算法思考:非0整数除法
  • 建造者模式构建对象
  • 电解电容的参数指标
  • 高频更新字段问题思路
  • 【C++】基础入门(详解)
  • CAS单点登录(第7版)9.属性
  • 关于Redis的主从复制(上)
  • 【大模型部署实战】Ollama如何保持模型常驻内存,或者显存,如何立刻释放
  • 前缀和(Prefix Sum)算法笔记C++
  • ROS1基础学习[记录b站阿杰]
  • 通用节流函数
  • 前缀和、区间和的差别
  • 第一节 Python简介、标识符、注释、六大数据类型简介、for循环、运算符
  • Vue极简插件安装
  • 【快速入门】Unity 常用组件(功能块)
  • 自定义组件数据监听器案例,纯数据字段,自定义组件生命周期,页面的生命周期,插槽
  • C++ references
  • XMOS的多项音频技术创新将大模型与边缘AI应用密切联系形成生态化合
  • Map 和 Set
  • 类与对象C++详解(中)-----构造函数与析构函数
  • 大数据学习(46) - Flink按键分区处理函数
  • dl学习笔记(11):VGG,NIN,GooleNet经典架构pytorch实现
  • 跳跃游戏 II - 贪心算法解法
  • nacos2.0.4源码启动
  • win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
  • PHP 数组与数据结构详解