1 /** 2 * 多线程_并发协作_管程法 3 * 4 * @author: mhSui 2020/04/21 5 */ 6 public class Test01 { 7 public static void main(String[] args) { 8 SynContainer container = new SynContainer(); 9 new Productor(container).start(); 10 new Consumer(container).start(); 11 } 12 } 13 14 //生产者 15 class Productor extends Thread{ 16 SynContainer container; 17 public Productor(SynContainer container){ 18 this.container = container; 19 } 20 21 @Override 22 public synchronized void run() { 23 //生产玩具 24 for (int i = 0;i < 100;i++){ 25 System.out.println("生产-->"+ i +"个玩具"); 26 container.push(new ProductNum(i)); 27 } 28 } 29 } 30 31 //消费者 32 class Consumer extends Thread{ 33 SynContainer container; 34 public Consumer(SynContainer container){ 35 this.container = container; 36 } 37 38 @Override 39 public void run() { 40 //消费 41 for (int i = 0;i < 100;i++){ 42 System.out.println("消费-->"+ container.pop().id +"个玩具"); 43 } 44 } 45 } 46 47 //存放容器——仓库 48 class SynContainer{ 49 //存储容器 50 ProductNum[] productNums = new ProductNum[10]; 51 //计数器 52 int count = 0; 53 //存储 生产 54 public synchronized void push(ProductNum productNum){ 55 //何时能生产 容器存在空间 56 //不能生产 57 if (count == productNums.length){ 58 try { 59 this.wait();//线程阻塞 消费者者通知生产者解除 60 } catch (InterruptedException e) { 61 e.printStackTrace(); 62 } 63 } 64 productNums[count] = productNum; 65 count++; 66 //存在数据了,通知消费者消费数据 67 this.notifyAll(); 68 } 69 70 //消费 获取 71 public synchronized ProductNum pop(){ 72 //何时消费 容器中是否存在数据 73 //没有数据 只有等待 74 if (count == 0){ 75 try { 76 this.wait();//线程阻塞 生产通知消费解除 77 } catch (InterruptedException e) { 78 e.printStackTrace(); 79 } 80 } 81 //存在数据可以消费 82 count--; 83 ProductNum productNum = productNums[count]; 84 this.notifyAll();//存在空间 唤醒生产者生产 85 return productNum; 86 } 87 } 88 89 //生产的产品 90 class ProductNum{ 91 int id;//给生产的产品加个编号 92 public ProductNum(int id){ 93 this.id = id; 94 } 95 }