生产者消费者模型 管程法

生产者-消费者模型

主线程{

创建一个缓冲区对象

生产者调用这个对象开始线程

消费调用这个对象开始线程

}

类 生产者继承Thread{

定义一个缓冲区对象

构建与类同名方法

重写run{一只一只生产鸡}

}

消费者继承Thread{

定义一个缓冲区对象

构建与类同名方法

重写run{一只一只消费鸡}

}

类 缓冲区{

创建对象 鸡编号

定义容器计数器

构建方法 生产者生产产品{

容器满了,生产等待(就会执行通知消费者消费)

容器没满,产品放入,容器计数,通知消费者消费

}

构建方法 消费者消费产品{

计数器空的,生产等待(就会执行通知生产者生产)

计数器有数,产品减少,开始消费,通知生产者生产,返回鸡的编号

}

}

package Multithreading;


//生产者-消费者模型 管程法
public class TestPC {
   public static void main(String[] args) {
       Buffer buffer = new Buffer();
       new Productor(buffer).start();
       new Buyer(buffer).start();
  }
}
class Productor extends Thread{
   //定义生产者
   Buffer container;
   public Productor(Buffer container){
       this.container=container;
  }
   //生产方法
   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           System.out.println("生产了第"+i+"只鸡");
           container.push(new Chicken(i));
      }
  }
}
class Buyer extends Thread{
   //定义消费者
   Buffer container;
   public Buyer(Buffer container){
       this.container=container;
  }
   //消费方法

   @Override
   public 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 Buffer{
   //定义容器大小
   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;
  }
}

 

 

posted on 2022-03-04 15:09  吴XX  阅读(77)  评论(0)    收藏  举报