千家信息网

Java多线程中消费者生产者模式怎么实现

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"Java多线程中消费者生产者模式怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java多线程中消费者生产者模式怎么实现"吧
千家信息网最后更新 2026年11月03日Java多线程中消费者生产者模式怎么实现

这篇文章主要讲解了"Java多线程中消费者生产者模式怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java多线程中消费者生产者模式怎么实现"吧!

/*@author shijin  * 生产者与消费者模型中,要保证以下几点:  * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized  * 2 同一时间内只能有一个消费者消费     消费方法加锁sychronized  * 3 生产者生产的同时消费者不能消费     生产方法加锁sychronized  * 4 消费者消费的同时生产者不能生产     消费方法加锁sychronized  * 5 共享空间空时消费者不能继续消费     消费前循环判断是否为空,空的话将该线程wait,释放锁允许其他同步方法执行  * 6 共享空间满时生产者不能继续生产     生产前循环判断是否为满,满的话将该线程wait,释放锁允许其他同步方法执行     */  //主类  class  ProducerConsumer  {      public static void main(String[] args)       {          StackBasket s = new StackBasket();          Producer p = new Producer(s);          Consumer c = new Consumer(s);          Thread tp = new Thread(p);          Thread tc = new Thread(c);          tp.start();          tc.start();      }  }   //  class Mantou  {      private int id;            Mantou(int id){          this.id = id;      }       public String toString(){          return "Mantou :" + id;      }  }   //共享栈空间  class StackBasket  {      Mantou sm[] = new Mantou[6];      int index = 0;            /**       * show 生产方法.      * show 该方法为同步方法,持有方法锁;      * show 首先循环判断满否,满的话使该线程等待,释放同步方法锁,允许消费;      * show 当不满时首先唤醒正在等待的消费方法,但是也只能让其进入就绪状态,      * show 等生产结束释放同步方法锁后消费才能持有该锁进行消费      * @param m 元素      * @return 没有返回值       */        public synchronized void push(Mantou m){          try{              while(index == sm.length){                  System.out.println("!!!!!!!!!生产满了!!!!!!!!!");                  this.wait();              }              this.notify();          }catch(InterruptedException e){              e.printStackTrace();          }catch(IllegalMonitorStateException e){              e.printStackTrace();          }                    sm[index] = m;          index++;          System.out.println("生产了:" + m + " 共" + index + "个馒头");      }       /**       * show 消费方法      * show 该方法为同步方法,持有方法锁      * show 首先循环判断空否,空的话使该线程等待,释放同步方法锁,允许生产;      * show 当不空时首先唤醒正在等待的生产方法,但是也只能让其进入就绪状态      * show 等消费结束释放同步方法锁后生产才能持有该锁进行生产      * @param b true 表示显示,false 表示隐藏       * @return 没有返回值       */       public synchronized Mantou pop(){          try{              while(index == 0){                  System.out.println("!!!!!!!!!消费光了!!!!!!!!!");                  this.wait();              }              this.notify();          }catch(InterruptedException e){              e.printStackTrace();          }catch(IllegalMonitorStateException e){              e.printStackTrace();          }          index--;          System.out.println("消费了:---------" + sm[index] + " 共" + index + "个馒头");          return sm[index];      }  }   class Producer implements Runnable  {      StackBasket ss = new StackBasket();      Producer(StackBasket ss){          this.ss = ss;      }       /**       * show 生产进程.       */       public void run(){          for(int i = 0;i < 20;i++){              Mantou m = new Mantou(i);              ss.push(m);  //          System.out.println("生产了:" + m + " 共" + ss.index + "个馒头");  //          在上面一行进行测试是不妥的,对index的访问应该在原子操作里,因为可能在push之后此输出之前又消费了,会产生输出混乱              try{                  Thread.sleep((int)(Math.random()*500));              }catch(InterruptedException e){                  e.printStackTrace();              }          }      }  }   class Consumer implements Runnable  {      StackBasket ss = new StackBasket();      Consumer(StackBasket ss){          this.ss = ss;      }       /**       * show 消费进程.      */       public void run(){          for(int i = 0;i < 20;i++){              Mantou m = ss.pop();  //          System.out.println("消费了:---------" + m + " 共" + ss.index + "个馒头");  //  同上  在上面一行进行测试也是不妥的,对index的访问应该在原子操作里,因为可能在pop之后此输出之前又生产了,会产生输出混乱              try{                  Thread.sleep((int)(Math.random()*1000));              }catch(InterruptedException e){                  e.printStackTrace();              }          }      }  }

感谢各位的阅读,以上就是"Java多线程中消费者生产者模式怎么实现"的内容了,经过本文的学习后,相信大家对Java多线程中消费者生产者模式怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

消费 生产 方法 消费者 生产者 线程 同步 模式 馒头 循环 输出 空间 学习 不妥 混乱 一行 内容 原子 同时 时间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 互联网科技网 重生之互联网科技帝国 网络科技有限互联网 互联网 科技创业 山东吉时兔互联网科技有限公司 深圳前海聚择互联网科技有限公司 北京华百购互联网科技有限公司 汽车互联网创新科技园 互联网科技扶贫时间 国大互联网教育科技有限公司工作 翼展科技 首家互联网医院 玉溪新华互联网科技好不好 工业互联网展湾科技股份有限公司 黑云互联网科技有限公司 广州有谷有贝互联网科技有限公司 福仕德教育科技互联网 互联网科技职业技能培训学校 重庆科技产业互联网有哪些 山东亿川互联网科技有限责任公司 互联网与科技金融数据 世界互联网领先科技成果 互联网高科技股票 衡水科技产业互联网平台 广州燕处互联网科技有限公司 全球科技与互联网公司市值变化 云南互联网科技学费 互联网科技大会大佬 互联网科技大佬云集 瑞安市蟠桃会互联网科技有限公司
0