Java多线程中消费者生产者模式怎么实现
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要讲解了"Java多线程中消费者生产者模式怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java多线程中消费者生产者模式怎么实现"吧
千家信息网最后更新 2025年02月02日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安全错误
数据库的锁怎样保障安全
崩坏3pc端在哪选服务器
cc防护服务器可以租用吗
触发器转存到另一个数据库
地城之光与服务器
河南程序软件开发哪家可靠
华为服务器web管理错误
数据库ma什么意思
知网查重的英文数据库
韵达数据库设计
重庆万州众道生鲜软件开发
cmd ie代理服务器
哪个检索系统支持多个数据库
c查询数据库
上海宝宏软件开发
局域网服务器电脑能用吗
测序数据公共数据库
宁夏仓储物流微服务架构数据库
金服网络技术公司招聘
继续播放网络安全主题手抄报
app定制软件开发哪家专业
平台网络安全
数据库中怎样导入数据库中
海洋cms数据库在哪
深圳 服务器维修
才思敏捷的数据库
职教高考网络安全
做软件开发跟ui哪个有发展
网络安全工程专业
成都思安网络技术
维普中文科技期刊数据库索引