管程法

线程协作

wait():表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁

wait(long timeout):指定等待的毫秒数

notify():唤醒一个处于等待状态的线程

notifyAll():唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度

package gaoji;

public class TestPC1 {

   public static void main(String[] args) {
       SynContainer1 synContainer1 = new SynContainer1();

       new Productor1(synContainer1).start();
       new Consumer1(synContainer1).start();


  }
}
class Productor1 extends Thread {

   SynContainer1 container1;
   public Productor1(SynContainer1 container1){
       this.container1 = container1;
  }

   @Override
   public void run() {
       for (int i = 1; i <= 100; i++) {
           System.out.println("生产了第"+i+"只鸡");
           try {
               container1.push(new Chicken1(i));
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
      }
  }
}
class Consumer1 extends Thread{
   SynContainer1 container1;
   public  Consumer1 (SynContainer1 container1){
       this.container1 = container1;
  }
   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           try {
               System.out.println("消费了第"+container1.pop().id+"只鸡");
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
      }
  }
}
class Chicken1{
   int id;//鸡的编号
   public Chicken1(int id) {
       this.id = id;
  }
}
class SynContainer1{
   //需要一个容器大小
   Chicken1[] chickens = new Chicken1[10];
   //容器计数器
   int count = 0;
   //生产者放入产品
   public synchronized void push(Chicken1 chicken) throws InterruptedException {
       //如果容器满了,就需要等待消费者消费
       if (count == chickens.length){
           //通知消费者消费,生产等待
           this.wait();
      }
       //如果没有满,我们就需要丢入产品
       chickens[count++] = chicken;
       //可以通知消费者消费了
       this.notifyAll();
  }
   //消费者消费产品
   public synchronized Chicken1 pop() throws InterruptedException {
       //判断是否消费
       if (count == 0) {
           //消费者等待
           this.wait();
      }
       //如果可以消费
       count--;
       Chicken1 chicken = chickens[count];

       //吃完了,通知生产者生产
       this.notifyAll();
       return chicken;
  }
}

 

posted @ 2021-04-10 10:02  术树  阅读(50)  评论(0)    收藏  举报