生产者与消费者以及多个容器的多线程问题(经典 集合了老师,同学以及自己的想法)
1 package day2016_10_25_Thread; 2 3 import java.util.LinkedList; 4 import java.util.Random; 5 6 public class Productor { 7 public static void main(String[] args) throws InterruptedException { 8 9 //多个容器 10 Box box = new Box(); 11 Box box2 = new Box(); 12 13 //解决生产者,消费者,容器共用一个对象锁的问题 14 Object obj=new Object(); 15 Producter p = new Producter(box, box2,obj); 16 Customer c = new Customer(box, box2,obj); 17 18 Thread tp = new Thread(p, "productor"); 19 Thread tc = new Thread(c, "consumer"); 20 21 tp.start(); 22 tc.start(); 23 24 Thread.sleep(3000); 25 System.out.println(box.size() + "--------------------" + box2.size()); 26 } 27 } 28 29 class Producter implements Runnable { 30 Object obj; 31 Box box1; 32 Box box2; 33 34 Producter(Box box1, Box box2,Object obj) { 35 this.box1 = box1; 36 this.box2 = box2; 37 this.obj=obj; 38 } 39 40 @Override 41 public void run() { 42 43 System.out.println(Thread.currentThread().getName()); 44 45 for (int i = 0; i < 30; i++) { 46 synchronized (obj) { 47 obj.notify(); 48 if(i==49){ 49 System.out.println("生产者30次循环结束!"); 50 } 51 if (box1.size() >= 10 && box2.size() >= 10) { 52 try { 53 obj.wait(); // 本线程等待 54 } catch (InterruptedException e) { 55 e.printStackTrace(); 56 } 57 } else if (box1.size() >= 10 && box2.size() < 10) { 58 box2.push(new Bread("bread-" + i)); 59 System.out.println(Thread.currentThread().getName() 60 + "-> box2 : " + box2.size()); 61 } else if (box1.size() < 10 && box2.size() >= 10) { 62 box1.push(new Bread("bread-" + i)); 63 System.out.println(Thread.currentThread().getName() 64 + "-> box1 : " + box1.size()); 65 } else { 66 Random ran = new Random(); 67 int num = ran.nextInt(2); 68 if (num == 0) { 69 box1.push(new Bread("bread-" + i)); 70 System.out.println(Thread.currentThread().getName() 71 + "-> box1 : " + box1.size()); 72 } else { 73 box2.push(new Bread("bread-" + i)); 74 System.out.println(Thread.currentThread().getName() 75 + "-> box2 : " + box2.size()); 76 } 77 } 78 } 79 } 80 81 } 82 } 83 84 class Customer implements Runnable { 85 Object obj; 86 Box box1; 87 Box box2; 88 89 Customer(Box box1, Box box2,Object obj) { 90 this.box1 = box1; 91 this.box2 = box2; 92 this.obj=obj; 93 } 94 95 @Override 96 public void run() { 97 98 System.out.println(Thread.currentThread().getName()); 99 100 for (int i = 0; i < 30; i++) { 101 synchronized (obj) { 102 obj.notify(); 103 if(i==49){ 104 System.out.println("消费者30次循环结束!"); 105 } 106 if (box1.size() <= 3 && box2.size() <= 3) { 107 try { 108 obj.wait(); 109 } catch (InterruptedException e) { 110 e.printStackTrace(); 111 } 112 } else if (box1.size() <= 3 && box2.size() > 3) { 113 Bread b2 = box2.pop(); 114 System.out.println(Thread.currentThread().getName() 115 + "-> box2 : " + b2); 116 } else if (box1.size() > 3 && box2.size() <= 3) { 117 Bread b1 = box1.pop(); 118 System.out.println(Thread.currentThread().getName() 119 + "-> box1 : " + b1); 120 } else { 121 Random ran = new Random(); 122 int num = ran.nextInt(2); 123 if (num == 0) { 124 Bread b1 = box1.pop(); 125 System.out.println(Thread.currentThread().getName() 126 + "-> box1 : " + b1); 127 } else { 128 Bread b2 = box2.pop(); 129 System.out.println(Thread.currentThread().getName() 130 + "-> box2 : " + b2); 131 } 132 133 } 134 } 135 } 136 } 137 } 138 139 class Box { 140 LinkedList<Bread> list = new LinkedList<Bread>(); 141 int maxNum = 20; 142 143 public void push(Bread b) { 144 if (list.size() < maxNum) { 145 list.add(b); 146 } 147 148 } 149 150 public Bread pop() { 151 if (list.size() > 0) { 152 return list.remove(); 153 } 154 return null; 155 } 156 157 public int size() { 158 return list.size(); 159 } 160 } 161 162 class Bread { 163 private String sid; 164 165 Bread(String sid) { 166 this.sid = sid; 167 } 168 169 @Override 170 public String toString() { 171 return "sid= " + sid; 172 } 173 174 }