Java 生产者/消费者问题实例详解

发布时间 - 2026-01-11 00:42:37    点击率:

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。


以下实例演示了如何通过线程解决生产者/消费者问题:

/*
 author by w3cschool.cc
 ProducerConsumerTest.java
 */
public class ProducerConsumerTest {
  public static void main(String[] args) {
   CubbyHole c = new CubbyHole();
   Producer p1 = new Producer(c, 1);
   Consumer c1 = new Consumer(c, 1);
   p1.start(); 
   c1.start();
  }
}
class CubbyHole {
  private int contents;
  private boolean available = false;
  public synchronized int get() {
   while (available == false) {
     try {
      wait();
     }
     catch (InterruptedException e) {
     }
   }
   available = false;
   notifyAll();
   return contents;
  }
  public synchronized void put(int value) {
   while (available == true) {
     try {
      wait();
     }
     catch (InterruptedException e) { 
     } 
   }
   contents = value;
   available = true;
   notifyAll();
  }
}
class Consumer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Consumer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }
  public void run() {
   int value = 0;
     for (int i = 0; i < 10; i++) {
      value = cubbyhole.get();
      System.out.println("消费者 #" + this.number+ " got: " + value);
     }
  }
}
class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Producer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }
  public void run() {
   for (int i = 0; i < 10; i++) {
     cubbyhole.put(i);
     System.out.println("生产者 #" + this.number + " put: " + i);
     try {
      sleep((int)(Math.random() * 100));
     } catch (InterruptedException e) { }
   }
  }
}

以上代码运行输出结果为:

消费者 #1 got: 0
生产者 #1 put: 0
生产者 #1 put: 1
消费者 #1 got: 1
生产者 #1 put: 2
消费者 #1 got: 2
生产者 #1 put: 3
消费者 #1 got: 3
生产者 #1 put: 4
消费者 #1 got: 4
生产者 #1 put: 5
消费者 #1 got: 5
生产者 #1 put: 6
消费者 #1 got: 6
生产者 #1 put: 7
消费者 #1 got: 7
生产者 #1 put: 8
消费者 #1 got: 8
生产者 #1 put: 9
消费者 #1 got: 9

希望本篇文章对您有所帮助


# Java  # 生产者/消费者实例  # Java生产者消费者  # Java实现Kafka生产者消费者代码实例  # Java基于Lock的生产者消费者模型示例  # kafka生产者和消费者的javaAPI的示例代码  # 基于Java 生产者消费者模式(详细分析)  # Java实现生产者消费者问题与读者写者问题详解  # Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解  # JAVA多线程实现生产者消费者的实例详解  # Java多种方式实现生产者消费者模式  # 等着  # 死锁  # 问题是  # 所示  # 对您  # 已满  # 如下图  # 用着  # 而向  # 时间段内  # 在同一  # public  # static  # ProducerConsumerTest  # w3cschool  # cc  # String  # args  # CubbyHole  # void 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用狗爹虚拟主机快速搭建网站?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  网站制作壁纸教程视频,电脑壁纸网站?  如何在阿里云域名上完成建站全流程?  javascript读取文本节点方法小结  Firefox Developer Edition开发者版本入口  如何为不同团队 ID 动态生成多个独立按钮  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Swift中switch语句区间和元组模式匹配  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  ,交易猫的商品怎么发布到网站上去?  微信公众帐号开发教程之图文消息全攻略  三星网站视频制作教程下载,三星w23网页如何全屏?  如何构建满足综合性能需求的优质建站方案?  Android仿QQ列表左滑删除操作  如何快速上传建站程序避免常见错误?  Laravel如何处理异常和错误?(Handler示例)  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何快速辨别茅台真假?关键步骤解析  七夕网站制作视频,七夕大促活动怎么报名?  如何在Windows服务器上快速搭建网站?  Laravel Session怎么存储_Laravel Session驱动配置详解  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Swift开发中switch语句值绑定模式  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何用PHP快速搭建高效网站?分步指南  韩国服务器如何优化跨境访问实现高效连接?  如何在万网开始建站?分步指南解析  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel如何实现文件上传和存储?(本地与S3配置)  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel中的Facade(门面)到底是什么原理  Android自定义listview布局实现上拉加载下拉刷新功能  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何做网站制作流程,*游戏网站怎么搭建?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何在橙子建站上传落地页?操作指南详解  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  什么是javascript作用域_全局和局部作用域有什么区别?