生产者消费者模式详解及如何通过java代码实现
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,生产者消费者模式详解及如何通过java代码实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。生产者消费者模式说明:1.生
千家信息网最后更新 2025年11月07日生产者消费者模式详解及如何通过java代码实现
生产者消费者模式详解及如何通过java代码实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
生产者消费者模式说明:
1.生产者只在仓库未满时进行生产,仓库满时生产者进程被阻塞;
2.消费者只在仓库非空时进行消费,仓库为空时消费者进程被阻塞;
3.当消费者发现仓库为空时会通知生产者生产;
4.当生产者发现仓库满时会通知消费者消费;
实现的关键:
共享内存中的两个同步方法,及同步方法中wait()方法的调用,同步保证了对象只能被一个线程占用,wait保证了当线程在等待过程中释放锁,使得其他对象有机会获得锁。
在一个对象中,用synchonized声明的方法为同步方法。Java中有一个同步模型-监视器,负责管理线程对对象中的同步方法的访问,它的原理是:赋予该对象唯一一把'钥匙',当多个线程进入对象,只有取得该对象钥匙的线程才可以访问同步方法,其它线程在该对象中等待,直到该线程用wait()方法放弃这把钥匙,其它等待的线程抢占该钥匙,抢占到钥匙的线程后才可得以执行,而没有取得钥匙的线程仍被阻塞在该对象中等待。 总而言之,synchonized使得只有一个线程能进入临界代码区。
代码实现:
package com.thread;public class ProducerConsumer { public static void main(String[] args) { ShareData sd = new ShareData(); new Producer(sd).start(); new Consumer(sd).start(); }}class Producer extends Thread{ private ShareData sd; public Producer(ShareData sd){ this.sd = sd; } @Override public void run() { for(int i = 0; i < 20; i++){ int product = (int)(Math.random()*1000); sd.setArray(product); try { Thread.sleep((int)(Math.random()*200)); } catch (InterruptedException e) { e.printStackTrace(); } } }}class Consumer extends Thread{ private ShareData sd; public Consumer(ShareData sd){ this.sd = sd; } @Override public void run() { for(int i = 0; i < 20; i++){ sd.getArray(); try { Thread.sleep((int)(Math.random()*200)); } catch (InterruptedException e) { e.printStackTrace(); } } }}class ShareData{ private static int shareArray[] = new int[10]; private int count; private int in; private int out; ShareData(){ this.count = 0; this.in = 0; this.out = 0; } public synchronized void setArray(int product){ try{ while(count >= shareArray.length){ System.out.println("array full."); this.wait(); } this.notify(); }catch (Exception e) { e.printStackTrace(); } shareArray[in] = product; count++; System.out.println("produce: " + product); in = (in + 1) % shareArray.length; } public synchronized int getArray(){ try{ while(count <= 0){ System.out.println("array empty."); this.wait(); } this.notify(); }catch(Exception e){ e.printStackTrace(); } int consume = shareArray[out]; count--; System.out.println("consume: " + consume); out = (out + 1) % shareArray.length; notify(); return consume; }}输出代码(每次都不同):
array empty.produce: 86consume: 86array empty.produce: 232consume: 232array empty.produce: 438consume: 438produce: 272consume: 272array empty.produce: 495consume: 495produce: 354produce: 533consume: 354produce: 92consume: 533produce: 374consume: 92produce: 441produce: 141consume: 374consume: 441consume: 141array empty.produce: 68consume: 68produce: 978consume: 978array empty.produce: 737consume: 737array empty.produce: 904consume: 904array empty.produce: 613consume: 613array empty.produce: 812consume: 812produce: 726produce: 326consume: 726produce: 305consume: 326consume: 305
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
线程
对象
消费
生产
方法
同步
消费者
生产者
仓库
钥匙
代码
阻塞
模式
只有
进程
保证
帮助
不同
清楚
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
重庆城航池互联网科技有限公司
天津通讯软件开发设施厂家现货
我的世界2b2t服务器怎么制作
数据库安全性完整性并发控制
勤哲服务器论坛
名师讲坛 校园网络安全
数据库2张表名一样
古冶区辅助网络技术售后服务
淮安高性能服务器供货厂
网络安全因素有哪4种
工业图控系统软件开发价格
软件开发需要哪些证件
软件开发和电气自动化
安卓手机怎么创建数据库
达梦数据库提示503解决方法
黔东南泰山服务器代理
广东微商软件开发市场价
三水网络安全宣传周
启蒙软件开发团队
网络安全人人有责绘画
数据库数据格式anc..200
名师讲坛 校园网络安全
西藏网络安全周是什么样子
杭州义牛网络技术有限公司
磐石服务器地址
十九大网络安全课题
网络安全法宣传演讲学校
关键字 数据库
本地建数据库
同一数据库中的表和查询不能重名