管程法

this.wait();让该线程等待

this.notifyAll();让另外线程开始

public class TestThreadWait {
   public static void main(String[] args) {
       SynContainer synContainer = new SynContainer();
       new Producer(synContainer).start();
       new Consumer(synContainer).start();

  }
}
//生产者
class Producer extends Thread{
   SynContainer container;

   public Producer(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().nums+"只鸡");
      }
  }
}
//产品
class Chicken{
   int nums;

   public Chicken(int nums) {
       this.nums = nums;
  }
}
//缓冲区
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 on 2021-03-08 22:21  要给小八赚罐头钱  阅读(128)  评论(0)    收藏  举报