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 }

浙公网安备 33010602011771号