生产者消费者模型——管程法

生产者消费者模型——管程法

package Thread;
//测试:生产消费者模型--->利用缓冲区解决:管程法
public class PCThread {
  public static void main(String[] args) {
      SynContainer container = new SynContainer();
      new Product(container).start();
      new Consumer(container).start();
  }
}
//生产者
class Product extends Thread{
SynContainer container;
Product(SynContainer container){
  this.container = container;
}
//生产
  @Override
  public void run() {
      for (int i = 0; i < 100; i++) {
          container.push(new Chicken(i));
          System.out.println("生产了"+i+"只鸡");

      }
  }
}
//消费者
class Consumer extends Thread{
SynContainer container;
Consumer(SynContainer container){
  this.container = container;
}
//消费

  @Override
  public void run() {
      for (int i = 0; i < 100; i++) {
          System.out.println("消费了---》"+container.pop().id+"只鸡");
      }
  }
}
//产品
class Chicken{

  public int id;

  public Chicken(int i) {
      this.id = i;
  }
}
//缓冲区
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.notifyAll();

  }
  public synchronized Chicken pop(){
      //判断能否消费
      if(count==0){
          //等待生产者生产,消费者等待
          try {
              this.wait();
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
      //如果可以消费
      count--;
      Chicken chicken = chickens[count];
      this.notifyAll();
      return chicken;
  }
}

 

posted @ 2020-12-22 15:44  QIDream  阅读(60)  评论(0)    收藏  举报