Java基础学习:多线程25( 管程法 )

Java基础学习:多线程25

  • 管程法:

    • 多复习;

     

  • 代码案例:


    /**
    * 测试生产者消费者模型:利用缓冲区解决:管程法
    *
    * 都有哪些对象:生产者,消费者,产品,缓冲区
    *
    */


    public class TestPC {
       public static void main(String[] args) {

           SynContainer container=new SynContainer();

           new Producttor(container).start();
           new Consumer(container).start();
      }

    }


    //生产者
    class Producttor extends Thread{
       SynContainer container;

       public Producttor(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().id+"鸡");
          }
      }
    }


    //产品
    class Chicken{
       int id;//产品编号

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

    //缓冲区
    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 @   gzs1024  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示