Java生产者和消费者例子_动力节点Java学院整理

发布时间 - 2026-01-11 01:16:04    点击率:

生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。

一,首先定义公共资源类,其中的变量number是保存的公共数据。

并且定义两个方法,增加number的值和减少number的值。由于多线程的原因,必须加上synchronized关键字,注意while判断的条件。

Java代码  

二,分别定义生产

 /** 
 * 公共资源类 
 */ 
 public class PublicResource { 
   private int number = 0; 
  
   /** 
   * 增加公共资源 
   */ 
   public synchronized void increace() { 
     while (number != 0) { 
       try { 
         wait(); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
     } 
     number++; 
     System.out.println(number); 
     notify(); 
   } 
  
   /** 
   * 减少公共资源 
   */ 
   public synchronized void decreace() { 
     while (number == 0) { 
       try { 
         wait(); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
     } 
     number--; 
     System.out.println(number); 
     notify(); 
   } 
 } 

者线程和消费者线程,并模拟多次生产和消费,即增加和减少公共资源的number值

Java代码  

/** 
 * 生产者线程,负责生产公共资源 
 */ 
 public class ProducerThread implements Runnable { 
   private PublicResource resource; 
  
   public ProducerThread(PublicResource resource) { 
     this.resource = resource; 
   } 
  
   @Override 
   public void run() { 
     for (int i = 0; i < 10; i++) { 
       try { 
         Thread.sleep((long) (Math.random() * 1000)); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
       resource.increace(); 
     } 
   } 
 } 
 /** 
 * 消费者线程,负责消费公共资源 
 */ 
 public class ConsumerThread implements Runnable { 
   private PublicResource resource; 
  
   public ConsumerThread(PublicResource resource) { 
     this.resource = resource; 
   } 
  
   @Override 
   public void run() { 
     for (int i = 0; i < 10; i++) { 
       try { 
         Thread.sleep((long) (Math.random() * 1000)); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
       resource.decreace(); 
     } 
   } 
 } 

三,模拟多个生产者和消费者操作公共资源的情形,结果须保证是在允许的范围内。

Java代码  

public class ProducerConsumerTest { 
   public static void main(String[] args) { 
     PublicResource resource = new PublicResource(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
   } 
 } 

以上所述是小编给大家介绍的Java生产者和消费者例子,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # 生产者和消费者  # java实现生产者消费者  # Java 生产者/消费者问题实例详解  # 浅谈java线程中生产者与消费者的问题  # Java并发编程中的生产者与消费者模型简述  # java多线程解决生产者消费者问题  # java解决单缓冲生产者消费者问题示例  # JAVA生产者消费者(线程同步)代码学习示例  # 公共资源  # 多个  # 还想  # 小编  # 是在  # 走了  # 在此  # 出现在  # 给大家  # 满了  # 再去  # 另外一个  # 其中一个  # 解决方法  # 所述  # 给我留言  # 多线程  # 感谢大家  # 空了  # 时再 


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


相关推荐: Windows Hello人脸识别突然无法使用  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel怎么清理缓存_Laravel optimize clear命令详解  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何在Windows环境下新建FTP站点并设置权限?  如何快速查询网站的真实建站时间?  nginx修改上传文件大小限制的方法  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在局域网内绑定自建网站域名?  非常酷的网站设计制作软件,酷培ai教育官方网站?  免费视频制作网站,更新又快又好的免费电影网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  网站图片在线制作软件,怎么在图片上做链接?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何用PHP快速搭建高效网站?分步指南  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  利用vue写todolist单页应用  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  JavaScript如何实现继承_有哪些常用方法  简历没回改:利用AI润色让你的文字更专业  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何快速搭建二级域名独立网站?  手机网站制作与建设方案,手机网站如何建设?  公司网站制作价格怎么算,公司办个官网需要多少钱?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Linux安全能力提升路径_长期防护思维说明【指导】  JS去除重复并统计数量的实现方法  长沙做网站要多少钱,长沙国安网络怎么样?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何在香港服务器上快速搭建免备案网站?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Bootstrap整体框架之CSS12栅格系统  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  javascript中对象的定义、使用以及对象和原型链操作小结  如何制作一个表白网站视频,关于勇敢表白的小标题?