package com.wuming.thread;//测试:生产者消费者模型,利用缓冲区解决:管程法 //生产者,消费者,产品,缓冲区 public class TestPC {public static void main(String[] args) {SynContainer container = new SynContainer();new Productor(container).start();new Consumer(container).start();}} //生产者 class Productor extends Thread{SynContainer container;public Productor(SynContainer container) {this.container = container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("生产了"+ i +"只鸡");container.push(new Chicken(i));}} } //消费者 class Consumer extends Thread{SynContainer container;public Consumer(SynContainer container) {this.container = container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消费了-->"+container.pop().id+"只鸡");}} } //产品 class Chicken{int id;//产品编号public Chicken(int id) {this.id = id;} } //缓冲区 class SynContainer{//需要一个容器大小Chicken[] chickens=new Chicken[10];//计数器int count=0;//生产者放入产品public synchronized void push(Chicken chicken){//如果容器满了,就需要等待消费者消费if (count==chickens.length){//通知消费者消费,生产等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果没有满,我们就需要丢入产品chickens[count]=chicken;count++;//可以通知消费者消费了this.notify();}//消费者消费产品public synchronized Chicken pop(){//判断能否消费if (count==0){//等待生产者生产,消费者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果可以消费count--;Chicken chicken=chickens[count];//吃完啦,通知生产者生产this.notify();return chicken;} }
生产了0只鸡
生产了1只鸡
生产了2只鸡
生产了3只鸡
生产了4只鸡
生产了5只鸡
生产了6只鸡
生产了7只鸡
生产了8只鸡
生产了9只鸡
生产了10只鸡
生产了11只鸡
消费了-->9只鸡
消费了-->10只鸡
消费了-->8只鸡
消费了-->7只鸡
消费了-->6只鸡
消费了-->5只鸡
消费了-->4只鸡
消费了-->3只鸡
消费了-->2只鸡
消费了-->1只鸡
消费了-->0只鸡
。。。。。。。