java多线程练习2(生产与消费)

用多线程模拟蜜蜂和熊的关系
     蜜蜂是生产者,熊是消费者。蜜蜂生产蜂蜜是累加的过程,熊
  吃蜂蜜是批量(满100吃掉)的过程。
  生产者和消费者之间使用通知方式告知对方。注意不能出现死
  锁的现象。
  100只蜜蜂,每次生产的蜂蜜是1.
  熊吃蜂蜜是20(批量的情况)。

  1 class ListDemo1
  2 {
  3     public static void main(String[] args) 
  4     {
  5         //这堆桶有5个同样大小的的桶
  6         Bucket bucket = new Bucket(5);  
  7         //蜜蜂跟熊公用的桶是相同的
  8         HoneybeeOf100 honey1 = new HoneybeeOf100(bucket);
  9         HoneybeeOf100 honey2 = new HoneybeeOf100(bucket);
 10         HoneybeeOf100 honey3 = new HoneybeeOf100(bucket);
 11         HoneybeeOf100 honey4 = new HoneybeeOf100(bucket);
 12         HoneybeeOf100 honey5 = new HoneybeeOf100(bucket);
 13         Bear beer1 = new Bear(bucket);
 14         //5组100只蜜蜂开始采蜜,1只熊开始吃蜂蜜
 15         honey1.start();
 16         honey2.start();
 17         honey3.start();
 18         honey4.start();
 19         honey5.start();
 20         beer1.start();
 21     }
 22 }
 23 
 24 //100只蜜蜂作为一起采蜜伙伴
 25 class HoneybeeOf100 extends Thread
 26 {
 27     //蜜蜂采蜜存放的桶
 28     private Bucket bucket;
 29     
 30     //构造初始化采蜜存放桶的对象
 31     HoneybeeOf100(Bucket bucket){
 32         this.bucket = bucket;
 33     }
 34 
 35     //蜜蜂把蜜存放到桶里
 36     public void run(){
 37         while(true){
 38             bucket.productMel();
 39             Thread.yield();
 40         }
 41     }
 42 }
 43 
 44 //熊吃蜂蜜
 45 class Bear extends Thread
 46 {
 47     //这些桶的蜂蜜是雄要吃的
 48     private Bucket bucket;
 49     //构造吃那些桶的蜂蜜
 50     Bear(Bucket bucket){
 51         this.bucket = bucket;
 52     }
 53 
 54     //熊开始以一次20点蜂蜜的量吃
 55     public void run(){
 56         while (true)
 57         {
 58             synchronized(bucket){
 59                 try{
 60                     while (bucket.getMel().size()<20)
 61                     {
 62                         bucket.wait();
 63                     }
 64                     //熊一次性吃20点蜂蜜
 65                     for (int i = 0;i < 20 ;i++ )
 66                     {
 67                         bucket.consumeMel();
 68                     }
 69 //                    bucket.notifyAll();
 70                     System.out.println("熊吃掉蜂蜜计数   ==   "+bucket.getConsumeMelCount());
 71                 }
 72                 catch(Exception e){
 73                 }
 74             }
 75             Thread.yield();
 76         }
 77     }
 78 }
 79 
 80 class Bucket
 81 {
 82     private int FULL_BUCKET_MEL = 100;  //设置一桶最大容纳蜂蜜量
 83     private int allMel;                 //总蜂蜜量
 84     private int numble;                 //桶的数量
 85     private static int addMelCount = 0;        //设置蜂蜜增加的计数
 86     private static int consumeMelCount;         //设置蜂蜜减少的计数
 87     private java.util.List<Integer> mel = new java.util.ArrayList<Integer>();   //初始化蜂蜜量集合
 88     
 89     //构造蜂蜜的总容量
 90     Bucket (int numble){
 91         this.numble = numble;
 92         allMel = FULL_BUCKET_MEL * numble;
 93     }
 94 
 95     //获得蜂蜜增加计数
 96     public int getAddMelCount(){
 97         return addMelCount;
 98     }
 99 
100     //获得蜂蜜减少计数
101     public int getConsumeMelCount(){
102         return consumeMelCount;
103     }
104 
105     //对外开放蜂蜜的总容量
106     public int getAllMel(){
107         return allMel;
108     }
109 
110     public java.util.List<Integer> getMel(){
111         return mel;
112     }
113 
114     //设置桶里一点一点的存放蜂蜜
115     public void productMel(){
116         synchronized(this){
117             try{
118                 while (mel.size() >= allMel)
119                 {
120                     this.wait();
121                 }
122                 mel.add(addMelCount++);
123                 this.notifyAll();
124                 System.out.println("蜂蜜总量==" + mel.size());
125                 System.out.println("蜂蜜计数==\t" + addMelCount);
126             }
127             catch(Exception e){
128                 e.printStackTrace();
129             }
130         }
131     }
132 
133     //设置桶里一点一点的减少蜂蜜
134     public void consumeMel(){
135         synchronized(this){
136             try{
137                 while(mel.size() <= 0){
138                     this.wait();
139                 }
140                 consumeMelCount = mel.remove(0)+1;
141                 this.notifyAll();
142             }
143             catch(Exception e){
144                 e.printStackTrace();
145             }
146         }
147     }
148 }

 

posted @ 2017-07-24 21:11  Aiface  阅读(278)  评论(0)    收藏  举报