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();
- }
- }
- }
- }
转载于:https://www.cnblogs.com/kaikailele/p/4009262.html
java多线程之消费者生产者模式相关推荐
- 多线程之消费者生产者模式加入阻塞队列
队列相关资料: http://chenjumin.iteye.com/blog/2182322 http://blog.csdn.net/luohuacanyue/article/details/16 ...
- Java多线程编程中Future模式的详解
转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...
- Java多线程(含生产者消费者模式详解)
多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...
- java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Cr ...
- Java多线程:解决生产者/消费者模式
什么是生产者/消费者模式 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品. 具体来说就是: 生产者 ...
- java 多线程经典例子——生产者与消费者的问题
产品名称类: public class Product {//产品名称private String name;public String getName() {return name;}public ...
- java实现基于管程法的消费者生产者模式(两个消费者一个生产者)
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...
- 基于java多线程来实现生产者和消费者的实例
声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...
- Java多线程2.3.生产者与消费者之间的关系2
生产者与消费者之间的关系 1.线程间通信问题描述图 2.线程的状态转换图及常见执行情况 3.等待唤醒机制思路图解 4.线程的生命周期
最新文章
- 状态和面向对象编程——1.定位步骤
- 计算机后门做法正确的是,网络信息安全知识:张同学发现安全软件提醒自己的电脑有系统漏洞,如果你是张同学,最恰当的做法是?()...
- 穷举n位二进制数 (深搜、回溯_子集树)
- 解决linux ssh客户端SSH连接linux服务器很慢的问题
- matplotlib 一张图多个图,如何在Matplotlib中绘制同一个图上的多个函数?
- 第六届蓝桥杯JavaC组_垒骰子_详解
- django 函数装饰器 变为 类装饰器
- 使用绝对布局的方法创建一个登录密码验证的简易窗口
- python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址
- 结果显示窗口如何缩小_Proe草绘时提示“截面再生失败。不合适的尺寸”如何处理?...
- 64位linux安装mysql数据库吗_Linux下安装Mysql数据库
- 计算机科学NIP,焦点:网络入侵防护(NIP)技术真的成了鸡肋吗? -电脑资料
- unity3d双面材质_[转]unity3d中创建双面材质
- macOS 10.15安装GDB
- HTML知识积累及实践(六) - pre,混合框架
- 网站三级域名是什么样?
- hdu 5064——Find Sequence
- 更新提示!Chrome新的零日漏洞正被利用
- 判断一个数为奇偶数的三种方法
- 巴比特《8问》专访 Conflux 创始人龙凡教授
热门文章
- 个人脚本收藏[不断更新 last update 2005-12-10]
- decide how to invest 15 million pound in the development cost?
- approach for attending ieee conferences
- 助力航天元器件管理“高可靠降成本”,赛思库获数千万元Pre-A轮融资
- ffmpeg命令详解(转)
- Xcode代码块的创建、使用和删除
- redis 基础操作学习
- JavaScript中的this妙用
- 低水平博士是提升科研生涯的毒药
- tcp/udp高并发和高吐吞性能测试工具