首页 > 其他 > 详细

管程法

时间:2021-03-08 22:53:22      阅读:28      评论:0      收藏:0      [点我收藏+]

管程法

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;
  }
}

管程法

原文:https://www.cnblogs.com/peanutist/p/14502685.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!