多线程-生产者消费者

生产者生产面包,消费者消费面包,当生产者生产到MAX个时,等待消费者消费,消费者没面包消费时,等待生产者生产,只有有面包,消费者就希望消费,但消费者食量有限,等到消费者消费到25个面包时,就不消费了,生产者生产到MAX个面包后,也停止了劳动!


[java]  view plain copy
  1. package jk2;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.Queue;  
  5.   
  6. public class SynThreadTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      * @author jake20001@126.com 
  11.      */  
  12.       
  13.     public static void main(String[] args) {  
  14.         // TODO Auto-generated method stub  
  15.         int MAX=10;  
  16.         Queue<Object> q = new LinkedList<Object>();  
  17.         Producer p = new Producer(q,MAX);  
  18.         Consumer c = new Consumer(q,p);  
  19.         p.start();  
  20.         c.start();  
  21.     }  
  22. }  
  23.   
  24. class Producer extends Thread {  
  25.     Queue<Object> q ;  
  26.     int total;  
  27.     int i = 0;  
  28.       
  29.     Producer(Queue<Object> q,int total){  
  30.         this.q = q;  
  31.         this.total = total;  
  32.     }  
  33.       
  34.     public void run(){  
  35.         while(true){  
  36.             synchronized(q){  
  37.                   
  38.                     while(q.size()==total){  
  39.                         System.out.println("Producer is full!");  
  40.                         try {  
  41.                             q.wait();  
  42.                         } catch (InterruptedException e) {  
  43.                             e.printStackTrace();  
  44.                         }  
  45.                     }  
  46.                     i++;  
  47.                     Object b = new Bread(i);  
  48.                     if(q.add(b)){  
  49.                         System.out.println("Producer is processing! " + b.toString());  
  50.                         q.notify();  
  51.                         try {  
  52.                             Thread.sleep(10);  
  53.                         } catch (InterruptedException e) {  
  54.                             e.printStackTrace();  
  55.                         }  
  56.                     }  
  57.             }  
  58.         }  
  59.     }  
  60. }  
  61.   
  62. class Consumer extends Thread {  
  63.     Queue<Object> q;  
  64.     Producer pr;  
  65.       
  66.     Consumer(Queue<Object> q,Producer pr){  
  67.         this.q = q;  
  68.         this.pr = pr;  
  69.     }  
  70.       
  71.     public void run(){  
  72.           
  73.         while(true){  
  74.             synchronized(q){  
  75.                   
  76.                     while(q.size()==0){  
  77.                         System.out.println("Consumer is waiting for products! ");  
  78.                         try {  
  79.                             q.wait();  
  80.                         } catch (InterruptedException e) {  
  81.                             e.printStackTrace();  
  82.                         }  
  83.                     }  
  84.                   
  85.                     if(q.size()>0){  
  86.                         /*System.out.println("================" + pr.i); 
  87.                         if(pr.i >= 25){  
  88.                             System.out.println("You eat too much!Stop!"); 
  89.                             return; 
  90.                         }*/  
  91.                         Object rb= q.remove();  
  92.                         System.out.println("Consumer is consuming products! "  + rb.toString());  
  93.                         if(((Bread) rb).getNumber()==25){  
  94.                             System.out.println("精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!");  
  95.                             System.out.println("You eat too much!Stop!");  
  96.                             return;  
  97.                         }  
  98.                         q.notify();  
  99.                         try {  
  100.                             Thread.sleep(10);  
  101.                         } catch (InterruptedException e) {  
  102.                             e.printStackTrace();  
  103.                         }  
  104.                     }  
  105.             }  
  106.         }  
  107.     }  
  108.       
  109. }  
  110.   
  111. class Bread{  
  112.     int number;  
  113.   
  114.     public Bread(int n) {  
  115.         number = n;  
  116.     }  
  117.     public int getNumber() {  
  118.         return number;  
  119.     }  
  120.   
  121.     public void setNumber(int number) {  
  122.         this.number = number;  
  123.     }  
  124.       
  125.     public String toString(){  
  126.           
  127.         return "第  " +  number + " 个 面包!";  
  128.     }  
  129. }  

输出:

Producer is processing! 第  1 个 面包!
Consumer is consuming products! 第  1 个 面包!
Consumer is waiting for products! 
Producer is processing! 第  2 个 面包!
Producer is processing! 第  3 个 面包!
Producer is processing! 第  4 个 面包!
Producer is processing! 第  5 个 面包!
Producer is processing! 第  6 个 面包!
Producer is processing! 第  7 个 面包!
Producer is processing! 第  8 个 面包!
Consumer is consuming products! 第  2 个 面包!
Consumer is consuming products! 第  3 个 面包!
Consumer is consuming products! 第  4 个 面包!
Consumer is consuming products! 第  5 个 面包!
Producer is processing! 第  9 个 面包!
Producer is processing! 第  10 个 面包!
Producer is processing! 第  11 个 面包!
Producer is processing! 第  12 个 面包!
Producer is processing! 第  13 个 面包!
Producer is processing! 第  14 个 面包!
Producer is processing! 第  15 个 面包!
Producer is full!
Consumer is consuming products! 第  6 个 面包!
Consumer is consuming products! 第  7 个 面包!
Consumer is consuming products! 第  8 个 面包!
Producer is processing! 第  16 个 面包!
Producer is processing! 第  17 个 面包!
Consumer is consuming products! 第  9 个 面包!
Consumer is consuming products! 第  10 个 面包!
Consumer is consuming products! 第  11 个 面包!
Consumer is consuming products! 第  12 个 面包!
Consumer is consuming products! 第  13 个 面包!
Consumer is consuming products! 第  14 个 面包!
Consumer is consuming products! 第  15 个 面包!
Consumer is consuming products! 第  16 个 面包!
Producer is processing! 第  18 个 面包!
Producer is processing! 第  19 个 面包!
Consumer is consuming products! 第  17 个 面包!
Producer is processing! 第  20 个 面包!
Consumer is consuming products! 第  18 个 面包!
Consumer is consuming products! 第  19 个 面包!
Consumer is consuming products! 第  20 个 面包!
Consumer is waiting for products! 
Producer is processing! 第  21 个 面包!
Producer is processing! 第  22 个 面包!
Producer is processing! 第  23 个 面包!
Producer is processing! 第  24 个 面包!
Producer is processing! 第  25 个 面包!
Producer is processing! 第  26 个 面包!
Producer is processing! 第  27 个 面包!
Producer is processing! 第  28 个 面包!
Producer is processing! 第  29 个 面包!
Producer is processing! 第  30 个 面包!
Producer is full!
Consumer is consuming products! 第  21 个 面包!
Consumer is consuming products! 第  22 个 面包!
Consumer is consuming products! 第  23 个 面包!
Consumer is consuming products! 第  24 个 面包!
Consumer is consuming products! 第  25 个 面包!
精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!
You eat too much!Stop!
Producer is processing! 第  31 个 面包!
Producer is processing! 第  32 个 面包!
Producer is processing! 第  33 个 面包!
Producer is processing! 第  34 个 面包!
Producer is processing! 第  35 个 面包!
Producer is full!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值