【19】java多线程之生产者消费者经典问题

consumer和producer里面的线程休眠,一个10ms一个100ms只是为了让producer有更高概率获得对象锁,其实不写也线程休眠也可以。

  1. package thread;    
  2. public class ProduceConsume {  
  3.   
  4.     public static void main(String[] args) {  
  5.         SyncStack ss = new SyncStack();
  6.         Producer p = new Producer(ss);
  7.         Consume c = new Consume(ss);
  8.         Thread tp = new Thread(p);
  9.         Thread tc = new Thread(c);
  10.         tp.start();//启动生产者线程  
  11.         tc.start();//启动消费者线程  
  12.     }    
  13. }  
  14.   
  15. class SteamBread{  
  16.     int id;
  17.     SteamBread(int id){  
  18.         this.id = id;  
  19.     }  
  20.     public String toString(){  
  21.         return "steamBread:"+id;  
  22.     }  
  23. }  
  24.  
  25. class SyncStack{  
  26.     int index = 0;  
  27.     SteamBread[] stb = new SteamBread[6];//构造馒头数组,相当于馒头筐,容量是6  
  28.       
  29.     //放入框中,相当于入栈  
  30.     public synchronized void push(SteamBread sb){  
  31.         while(index==stb.length){//筐满了,即栈满,  
  32.             try {  
  33.                 this.wait();//让当前线程等待  
  34.             } catch (InterruptedException e) {  
  35.                 // TODO Auto-generated catch block  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }  
  39.         this.notify();//唤醒在此对象监视器上等待的单个线程,即消费者线程  
  40.         stb[index] = sb;  
  41.         this.index++;  
  42.     }  
  43.       
  44.     //从框中拿出,相当于出栈  
  45.     public synchronized SteamBread pop(){  
  46.         while(index==0){//筐空了,即栈空  
  47.             try {  
  48.                 this.wait();  
  49.             } catch (InterruptedException e) {  
  50.                 // TODO Auto-generated catch block  
  51.                 e.printStackTrace();  
  52.             }  
  53.         }  
  54.         this.notify();  
  55.         this.index--;//push第n个之后,this.index++,使栈顶为n+1,故return之前要减一  
  56.         return stb[index];  
  57.     }  
  58. }  
  59.   
  60. //生产者类,实现了Runnable接口,以便于构造生产者线程  
  61. class Producer implements Runnable{  
  62.     SyncStack ss = null;  
  63.     Producer(SyncStack ss){  
  64.         this.ss = ss;  
  65.     }  
  66.     @Override  
  67.     public void run() {  
  68.         // 开始生产馒头  
  69.         for(int i=0;i<20;i++){  
  70.             SteamBread stb = new SteamBread(i);  
  71.             ss.push(stb);  
  72.             System.out.println("生产了"+stb);  
  73.             try {  
  74.                 Thread.sleep(10);//每生产一个馒头,睡觉10毫秒  
  75.             } catch (InterruptedException e) {  
  76.                 // TODO Auto-generated catch block  
  77.                 e.printStackTrace();  
  78.             }  
  79.         }  
  80.     }  
  81. }  
  82.   
  83. //消费者类,实现了Runnable接口,以便于构造消费者线程  
  84. class Consume implements Runnable{  
  85.     SyncStack ss = null;  
  86.     public Consume(SyncStack ss) {  
  87.         super();  
  88.         this.ss = ss;  
  89.     }  
  90.     @Override  
  91.     public void run() {  
  92.         // TODO Auto-generated method stub  
  93.         for(int i=0;i<20;i++){//开始消费馒头  
  94.             SteamBread stb = ss.pop();  
  95.             System.out.println("消费了"+stb);  
  96.             try {  
  97.                 Thread.sleep(100);//每消费一个馒头,睡觉100毫秒。即生产多个,消费一个  
  98.             } catch (InterruptedException e) {  
  99.                 // TODO Auto-generated catch block  
  100.                 e.printStackTrace();  
  101.             }  
  102.         }  
  103.     }     
  104. }

运行结果:

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值