观察者消费者问题解决方案一 -- 管程法

直接上代码


/**
 * 生产者消费者模型
 *
 * 管程法
 *
 * 关键因素:生产者,消费者,产品,缓冲区
 */
public class PCTest {
  public static void main(String[] args) {
    SynContainer container = new SynContainer();
    Productor productor = new Productor(container);
    productor.start();
    Consumer consumer = new Consumer(container);
    consumer.start();

  }
}

/**
 * 生产者
 */
class Productor extends Thread {
  SynContainer container;

  public Productor(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;

  public Consumer(SynContainer container) {
    this.container = container;
  }

  @Override
  public void run() {
    for (int i = 0; i < 100; i++) {
      System.out.println("消费了---->" + container.pop().getId() + "只鸡");
    }
  }
}

/**
 * 产品:鸡
 */
class Chicken {
  /**
   * 编号
   */
  private int id;

  public Chicken(int id) {
    this.id = id;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}

/**
 * 缓冲区
 */
class SynContainer {
  /**
   * 消费产品
   */
  Chicken[] chickens = new Chicken[10];

  /**
   * 容器计数器
   */
  int count = 0;

  /**
   * 生产者生产产品
   * 
   * @param chicken
   */
  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];
    // 通知生产者生产
    // 唤醒所有进入wait的线程
    this.notifyAll();
    return chicken;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值