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

阻塞队列 BlockingQueue

什么是阻塞队列

BlockingQueue是 Java 并发包(java.util.concurrent)中的核心接口,它继承自Queue,支持在队列满时阻塞插入操作、在队列空时阻塞移除操作。它是实现生产者-消费者模式的标准工具。

核心特性

操作类型抛出异常返回特殊值阻塞等待超时退出
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
检查element()peek()不可用不可用

主要实现类

1.ArrayBlockingQueue— 有界数组队列

// 基于数组的有界阻塞队列,FIFOBlockingQueue<String>queue=newArrayBlockingQueue<>(100);// 公平锁模式(可选):按等待时间排序获取锁BlockingQueue<String>fairQueue=newArrayBlockingQueue<>(100,true);
  • 底层:循环数组 + 单锁(ReentrantLock)
  • 特点:必须指定容量,内存紧凑,适合固定容量场景

2.LinkedBlockingQueue— 链表队列

// 无界队列(默认 Integer.MAX_VALUE)BlockingQueue<String>unbounded=newLinkedBlockingQueue<>();// 有界队列BlockingQueue<String>bounded=newLinkedBlockingQueue<>(1000);
  • 底层:单向链表 + 双锁(队头锁 + 队尾锁)
  • 特点:吞吐量通常高于 ArrayBlockingQueue,无界时注意内存溢出

3.PriorityBlockingQueue— 优先级队列

BlockingQueue<Task>queue=newPriorityBlockingQueue<>(100,Comparator.comparing(Task::getPriority).reversed());
  • 底层:堆数组 + 单锁
  • 特点:元素必须实现Comparable或提供Comparator

4.DelayQueue— 延迟队列

BlockingQueue<DelayedTask>queue=newDelayQueue<>();// 元素必须实现 Delayed 接口
  • 特点:元素只有到期后才能被取出,常用于缓存过期、定时任务

5.SynchronousQueue— 同步队列

BlockingQueue<String>queue=newSynchronousQueue<>();
  • 特点:不存储元素,每个插入必须等待一个移除,反之亦然
  • 吞吐量最高,用于直接传递场景

6.LinkedTransferQueue— 传输队列(Java 7+)

TransferQueue<String>queue=newLinkedTransferQueue<>();// 特有方法:直接传递,避免入队queue.transfer("item");// 阻塞直到被消费queue.tryTransfer("item");// 立即返回
  • 特点:结合了 SynchronousQueue 和 LinkedBlockingQueue 的优势

经典生产者-消费者示例

publicclassProducerConsumer{privatestaticfinalBlockingQueue<Integer>queue=newLinkedBlockingQueue<>(10);staticclassProducerimplementsRunnable{publicvoidrun(){try{for(inti=0;i<100;i++){queue.put(i);// 队列满时自动阻塞System.out.println("生产: "+i);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}staticclassConsumerimplementsRunnable{publicvoidrun(){try{while(!Thread.interrupted()){Integeritem=queue.take();// 队列空时自动阻塞System.out.println("消费: "+item);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}publicstaticvoidmain(String[]args){ExecutorServiceexecutor=Executors.newFixedThreadPool(2);executor.submit(newProducer());executor.submit(newConsumer());executor.shutdown();}}

选择指南

场景推荐实现
固定容量、内存敏感ArrayBlockingQueue
高并发、双锁优化LinkedBlockingQueue
任务优先级调度PriorityBlockingQueue
定时/延迟任务DelayQueue
直接传递、无缓冲SynchronousQueue
需要直接传递语义LinkedTransferQueue

线程池中的应用

Java 线程池的核心组件就是阻塞队列:

ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,// 核心线程数10,// 最大线程数60L,TimeUnit.SECONDS,// 空闲线程存活时间newLinkedBlockingQueue<>(100),// 任务队列newThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略);

阻塞队列是 Java 并发编程的基础设施,理解其特性和适用场景对编写高效、可靠的并发程序至关重要。

http://www.jsqmd.com/news/519657/

相关文章:

  • 特征图融合三剑客:拼接、相加与相乘的实战指南
  • Day13 | Dart 类核心特性:静态成员、对象操作符与继承机制
  • 比话降AI超15%退款是真的吗?退款流程和条件全解析
  • 相场法在水力压裂模拟中越来越火,尤其是COMSOL这种多物理场耦合神器。今天咱们拆解几个典型工况,手把手看裂缝怎么在代码里“长“出来。先拿最简单的单裂缝开刀——
  • [2015] [Gorila DQN] [Massively Parallel Methods for Deep Reinforcement Learning]
  • Java并发避坑:一文搞懂死锁的本质、实例与解决方案
  • Python数据结构完全指南:列表、字典、元组与集合精通
  • Java锁升级深度解析:从偏向锁到重量级锁,一文读懂锁的“进化”之路
  • 为什么比话敢承诺“不达标全额退款“?技术底气在哪里
  • 计算机毕业设计 java 学校社团活动管理系统 JavaWeb 校园社团事务管理平台 基于 SpringBoot 的高校社团活动统筹系统
  • MinIO在Linux上的5个隐藏性能优化技巧(实测提升30%吞吐量)
  • 生殖健康咨询线上培训考试,北京守嘉职业技能,工作学习两不误 - 品牌排行榜单
  • React15 - React15应用Sass使用指南
  • BiSeNetV2双分支结构解析:如何用Detail Branch和Semantic Branch玩转实时分割?
  • 生殖健康咨询培训适合哪些人?北京守嘉全覆盖,人人可学 - 品牌排行榜单
  • 计算机毕设 java 辽宁工大毕业论文管理系统 Java 高校毕业论文全流程管理平台开发 基于 SpringBoot 的毕业论文选题与答辩管理系统实现
  • 为什么你的网速总是不达标?从带宽、吞吐量到时延的完整解析
  • 580万台登顶,割草机暴涨63.8%:2025全球清洁机器人座次表,国产包揽前五
  • 为什么说Tailscale是远程办公神器?深度解析WireGuard底层+真实团队协作案例
  • python+flask+vue3云南旅游景点酒店预订系统网站
  • SQLite - Perl:深入浅出数据库编程实践
  • 腾讯零信任提示系统的优化经验:提示工程架构师的参考!
  • 三方支付为什么不用双向ssl,与U盾
  • python+flask+vue3企业员工加班调休考勤请假管理系统
  • Python uWSGI 安装配置
  • ⋐ 11-2 ⋑ 软考高项 | 第 6 章:项目管理概论 [ 下 ]
  • 激光雷达:自动驾驶的“中国眼”与西方的反击之问
  • 数据中心能耗优化:AI应用架构师用边缘智能体实现20%节能的技巧
  • 大疆P4M多光谱影像辐射定标实战:从原理到精度验证
  • 云雀播放器 2026.3.6 | 高颜值音乐播放器 动画非常流畅 全球超1亿用户