当前位置: 首页 > 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(); // 不移除元素

相关文章:

  • 最佳的出牌方法
  • PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
  • [小M全新力作-修稿]PFC_LLC电源设计全攻略:从原理学习到SIMULINK仿真到EDA板实战,再到实物电源调试
  • 什么是元学习?
  • 算法思考:非0整数除法
  • 建造者模式构建对象
  • 电解电容的参数指标
  • 高频更新字段问题思路
  • 【C++】基础入门(详解)
  • CAS单点登录(第7版)9.属性
  • 关于Redis的主从复制(上)
  • 【大模型部署实战】Ollama如何保持模型常驻内存,或者显存,如何立刻释放
  • 前缀和(Prefix Sum)算法笔记C++
  • ROS1基础学习[记录b站阿杰]
  • 通用节流函数
  • 前缀和、区间和的差别
  • 第一节 Python简介、标识符、注释、六大数据类型简介、for循环、运算符
  • Vue极简插件安装
  • 【快速入门】Unity 常用组件(功能块)
  • 自定义组件数据监听器案例,纯数据字段,自定义组件生命周期,页面的生命周期,插槽
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 关税影响下沃尔玛想涨价,特朗普施压:自行承担,别转嫁给顾客
  • 《歌手》回归,人均技术流,00后整顿职场
  • 美国失去最后的AAA主权评级,继标普、惠誉后再遭穆迪降级
  • 紫光集团原董事长赵伟国一审被判死缓
  • 国务院关税税则委:调整对原产于美国的进口商品加征关税措施