千家信息网

生产者消费者模式详解及如何通过java代码实现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,生产者消费者模式详解及如何通过java代码实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。生产者消费者模式说明:1.生
千家信息网最后更新 2026年11月01日生产者消费者模式详解及如何通过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安全错误 数据库的锁怎样保障安全 广州淘业互联网络科技 科技互联网政务服务 互联网医疗科技 唐信互联网科技 天速互联网络科技有限公司 互联网科技中介 小米互联网科技园设置 北京华百购互联网科技有限公司 金融科技与互联网金融相同和不同 互联网时代科技改变生活 爱医互联网络科技 朱啸虎曾投资哪些互联网科技企业 互联网数据科技专业 每天都有哪些好的互联网科技 美国互联网科技公司 云鲸互联网络科技有限公司 青岛易易互联网科技 现代互联网科技公司 互联网高科技绘画 每日互联网科技新闻 互联网科技工作委员会副主任毛军 科技和互联网公司 科技互联网政务服务 互联网公司会议桌创意科技软装饰 华中科技有哪些互联网大佬 顶级互联网科技成果有哪些 佛山市拉法互联网科技有限公司 国大互联网教育科技有限公司薪资 广州富喜互联网络科技 互联网界的黑科技
0