标签:lis ack class 消费者模式 stat 编号 com span color
1 package com.thread.gaoji; 2 3 //测试: 生产者消费者模型-->利用缓冲区解决:管程法 4 5 //生产者 , 消费者 , 产品 , 缓冲区 6 public class TestPC { 7 8 public static void main(String[] args) { 9 SynContainer container = new SynContainer(); 10 11 new Productor(container).start(); 12 new Consumer(container).start(); 13 } 14 } 15 16 //生产者 17 class Productor extends Thread { 18 SynContainer container; 19 20 public Productor(SynContainer container) { 21 this.container = container; 22 } 23 24 //生产 25 @Override 26 public void run() { 27 for (int i = 0; i < 100; i++) { 28 container.push(new Chicken(i)); 29 System.out.println("生产了" + i + "只鸡"); 30 } 31 } 32 } 33 34 //消费者 35 class Consumer extends Thread { 36 SynContainer container; 37 38 public Consumer(SynContainer container) { 39 this.container = container; 40 } 41 42 //消费 43 @Override 44 public void run() { 45 for (int i = 0; i < 100; i++) { 46 System.out.println("消费了-->" + container.pop().id + "只鸡"); 47 } 48 } 49 } 50 51 //产品 52 class Chicken { 53 int id;//编号 54 55 public Chicken(int id) { 56 this.id = id; 57 } 58 } 59 60 //缓冲区 61 class SynContainer { 62 63 //需要一个容器大小 64 Chicken[] chickens = new Chicken[10]; 65 66 //容器计数器 67 int count = 0; 68 69 //生产者放入产品 70 public synchronized void push(Chicken chicken) { 71 //如果容器满了,就需要等待消费者消费 72 if (count == chickens.length) { 73 //生产者等待 74 try { 75 this.wait(); 76 } catch (InterruptedException e) { 77 e.printStackTrace(); 78 } 79 } 80 //如果没有满,我们需要丢入产品 81 chickens[count] = chicken; 82 count++; 83 84 //可以通知消费者消费了. 85 this.notifyAll(); 86 } 87 88 //消费者消费产品 89 public synchronized Chicken pop() { 90 //判断能否消费 91 if (count == 0) { 92 //消费者等待 93 try { 94 this.wait(); 95 } catch (InterruptedException e) { 96 e.printStackTrace(); 97 } 98 } 99 100 //如果可以消费 101 count--; 102 Chicken chicken = chickens[count]; 103 104 //吃完了,通知生产者生产 105 this.notifyAll(); 106 return chicken; 107 } 108 }
标签:lis ack class 消费者模式 stat 编号 com span color
原文地址:https://www.cnblogs.com/duanfu/p/12260806.html