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

Java生产者消费者模式实战解析

Java生产者消费者模式实战解析

      • 异步模式
        • 传统版
        • 改进版
        • 阻塞队列

异步模式

传统版

异步模式之生产者/消费者:

classShareData{privateintnumber=0;privateLocklock=newReentrantLock();privateConditioncondition=lock.newCondition();publicvoidincrement()throwsException{// 同步代码块,加锁lock.lock();try{// 判断 防止虚假唤醒while(number!=0){// 等待不能生产condition.await();}// 干活number++;System.out.println(Thread.currentThread().getName()+"\t "+number);// 通知 唤醒condition.signalAll();}catch(Exceptione){e.printStackTrace();}finally{lock.unlock();}}publicvoiddecrement()throwsException{// 同步代码块,加锁lock.lock();try{// 判断 防止虚假唤醒while(number==0){// 等待不能消费condition.await();}// 干活number--;System.out.println(Thread.currentThread().getName()+"\t "+number);// 通知 唤醒condition.signalAll();}catch(Exceptione){e.printStackTrace();}finally{lock.unlock();}}}publicclassTraditionalProducerConsumer{publicstaticvoidmain(String[]args){ShareDatashareData=newShareData();// t1线程,生产newThread(()->{for(inti=0;i<5;i++){shareData.increment();}},"t1").start();// t2线程,消费newThread(()->{for(inti=0;i<5;i++){shareData.decrement();}},"t2").start();}}
改进版

异步模式之生产者/消费者:

  • 消费队列可以用来平衡生产和消费的线程资源,不需要产生结果和消费结果的线程一一对应
  • 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据
  • 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据
  • JDK 中各种阻塞队列,采用的就是这种模式

publicclassdemo{publicstaticvoidmain(String[]args){MessageQueuequeue=newMessageQueue(2);for(inti=0;i<3;i++){intid=i;newThread(()->{queue.put(newMessage(id,"值"+id));},"生产者"+i).start();}newThread(()->{while(true){try{Thread.sleep(1000);Messagemessage=queue.take();}catch(InterruptedExceptione){e.printStackTrace();}}},"消费者").start();}}//消息队列类,Java间线程之间通信classMessageQueue{privateLinkedList<Message>list=newLinkedList<>();//消息的队列集合privateintcapacity;//队列容量publicMessageQueue(intcapacity){this.capacity=capacity;}//获取消息publicMessagetake(){//检查队列是否为空synchronized(list){while(list.isEmpty()){try{sout(Thread.currentThread().getName()+":队列为空,消费者线程等待");list.wait();}catch(InterruptedExceptione){e.printStackTrace();}}//从队列的头部获取消息返回Messagemessage=list.removeFirst();sout(Thread.currentThread().getName()+":已消费消息--"+message);list.notifyAll();returnmessage;}}//存入消息publicvoidput(Messagemessage){synchronized(list){//检查队列是否满while(list.size()==capacity){try{sout(Thread.currentThread().getName()+":队列为已满,生产者线程等待");list.wait();}catch(InterruptedExceptione){e.printStackTrace();}}//将消息加入队列尾部list.addLast(message);sout(Thread.currentThread().getName()+":已生产消息--"+message);list.notifyAll();}}}finalclassMessage{privateintid;privateObjectvalue;//get set}

阻塞队列
publicstaticvoidmain(String[]args){ExecutorServiceconsumer=Executors.newFixedThreadPool(1);ExecutorServiceproducer=Executors.newFixedThreadPool(1);BlockingQueue<Integer>queue=newSynchronousQueue<>();producer.submit(()->{try{System.out.println("生产...");Thread.sleep(1000);queue.put(10);}catch(InterruptedExceptione){e.printStackTrace();}});consumer.submit(()->{try{System.out.println("等待消费...");Integerresult=queue.take();System.out.println("结果为:"+result);}catch(InterruptedExceptione){e.printStackTrace();}});}

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

相关文章:

  • 内涵:文本识别论文CRNN
  • 保姆级避坑指南:在Ubuntu 20.04 + ROS Noetic下,用PX4和Gazebo给Livox Mid360雷达跑通Faster-LIO建图仿真
  • translategemma-27b-it效果展示:中文合同关键条款图→英文法律术语精准映射
  • GenomicSEM实战指南:从GWAS摘要数据到复杂遗传模型的完整解析
  • OpenClaw语音交互:Qwen3-14B实现本地语音指令识别
  • 如何一键智能优化浏览器字体渲染:告别模糊文字,享受Mac级阅读体验
  • AI原生研发不是“加AI”,而是重写研发契约(附百度文心、讯飞星火、通义千问团队签署的《AI-Native开发宪章》核心条款)
  • Redis持久化:从AOF到RDB,如何实现数据不丢失?偬
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习赡
  • STM32H7实战指南:Cache配置与性能调优
  • 如何快速获取百度网盘提取码:开源工具的终极实战指南
  • 如何通过Win11Debloat实现Windows 11终极优化:完整指南与实战技巧
  • 测试左移×AI原生×实时反馈:2026奇点大会验证的“零缺陷交付”新公式——含GitHub Star超1.2k的开源工具链实测对比
  • Allegro 23.1 快速放置报错?手把手教你用DB Doctor批量更新旧版封装(附脚本)
  • coze
  • 在超大数据集下 DuckDB 与 MySQL 查询速度对比匝
  • MongoDB(90)如何使用Mongoose进行ORM操作?
  • Linux部署DVWA实战:从Access Denied到数据库用户权限全解析
  • Java面试题47:一文深入了解Nginx
  • Python Scrcpy Client实战解析:构建高效的Android设备远程控制方案
  • ROS话题订阅模型实战:从零搭建一个简单的发布-订阅系统(附完整代码)
  • 【AI原生研发债务治理白皮书】:20年架构师亲授3类隐性技术债识别法+4步自动化清偿路径
  • MOOTDX:Python量化投资的完整通达信数据解决方案指南
  • OneTime Secret开发者入门指南:项目结构与代码贡献流程
  • 家庭媒体中心:OpenClaw+Gemma-3-12b-it自动整理影视库与生成字幕
  • WebPShop:Photoshop WebP插件终极指南 - 如何完美处理现代图像格式
  • 终极Windows 11瘦身指南:如何用Win11Debloat让你的电脑飞起来
  • KMS_VL_ALL_AIO:3分钟彻底解决Windows与Office激活难题的智能方案
  • 激活函数调参指南:如何根据你的任务选择ReLU、GELU或其他变体(附性能测试数据)
  • Win7 64 位 + MinGW64 + CMake + OpenCV 之二