创建四个类
1.面包类 锅里只可以放10个面包 ---装面包的容器
2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包
3.生产者
4消费者
5.测试类

多线程经典案例

import java.util.Stack;

//生产者消费者 问题 面包类
public class Brake {
    //做面包的锅 最多十个面包
    public static final int MAX_NUMBER=10;
    Stack<Integer> stack=new Stack<Integer>();
    public static int BRAKE_NUM=0; //面包的个数
    
    //做面包
    public synchronized  void insert(int number)
    {
        stack.push(number);
        Brake.BRAKE_NUM++;//锅里面包数+1
    }
    
    //拿面包
    public synchronized int remove()
    {
        
        Brake.BRAKE_NUM--;
        return stack.pop(); //出栈
    }
}
-------------------------------------------------------------

厨房类

public class Kitchen {
    private Brake brake;
    public  static int bigNumber = 0;///大林吃的数量
    public static int smallNumber = 0;
    public static int TOTAL_NUMBER = 100;//做面包的总数
    public static int iCount=1; //计数器  统计
    
    public Kitchen(Brake brake)
    {
        this.brake=brake;
    }
    
    //做面包的方法
    public synchronized void make()
    {
        //判断锅是否已满
        if(Brake.BRAKE_NUM<10)
        {
            brake.insert(Kitchen.iCount);
            System.out.println("妈妈做完了第"+Kitchen.iCount+"个面包");
            Kitchen.iCount++;
            notifyAll();//唤醒2个儿子吃面包
        }
        else
        {
            System.out.println("锅已经有10个面包,等待儿子吃面包");
            try
            {
                wait();
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }

//吃面包的方法
    public  synchronized void eat()
    {
        //判断锅里是否为空
        if(Brake.BRAKE_NUM>0)
        {
            int temp=brake.remove();//获得吃掉面包的编号
            System.out.println(Thread.currentThread().getName()+"吃掉了第"+temp+"个面包");
        if(Thread.currentThread().getName().equals("大林"))
        {
            bigNumber++;
        }
        else
        {
            smallNumber++;
        }
        notifyAll();//唤醒妈妈继续做面包
        }
        else
        {
            System.out.println("面包吃完了 等待妈妈做面包");
            try
            {
                wait();
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
}
------------------------------------------------------------------

//生产者类
public class Productor implements Runnable{
    private Kitchen kitchen;
    public Productor(Kitchen kitchen)
    {
        this.kitchen=kitchen;
    }
    @Override
    public void run() {
        while(true)
        {
            if(Kitchen.iCount>100)//一百个面包做完
            {
                break;                
            }else
            {
                try {
                    kitchen.make();//妈妈不断做面包
                    Thread.sleep(150);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }        
        }
        System.out.println("100个面包做完了");
    }
    
}

---------------------------------------------------------------

//定义消费者类
public class Consumer implements Runnable{
    private Kitchen kitchen;
    public Consumer(Kitchen kitchen)
    {
        this.kitchen=kitchen;
    }
    @Override
    public void run() {
        while(true)
        {
            //如何结束消费者线程
            if(Kitchen.iCount>100&&Brake.BRAKE_NUM<=0)
            {
                break;
            }else
            {
                try {
                    kitchen.eat();
                    Thread.sleep(100);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }        
    }
}
----------------------------------------------------------------------------------------------

//生产者消费者问题  java多线程实例项目
public class TestBrake {
    public static void main(String[] args) {
        Brake brake=new Brake();
        Kitchen kitchen=new Kitchen(brake);
        Productor p=new Productor(kitchen);
        Consumer c1=new Consumer(kitchen);
        Consumer c2=new Consumer(kitchen);
        //妈妈线程
        Thread mother=new Thread(p,"妈妈");
        Thread bigSon=new Thread(c1,"大林");
        Thread smallSon=new Thread(c1,"小林");
        mother.start();
        bigSon.start();
        smallSon.start();
        
        try {
            mother.join();
            bigSon.join();
            smallSon.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("大林吃了:"+Kitchen.bigNumber+"个面包");
        System.out.println("小林吃了:"+Kitchen.smallNumber+"个面包");

}
}

JAVA多线程之生产者 消费者模式 妈妈做面包案例的更多相关文章

  1. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

  2. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

  3. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

  4. Java多线程编程——生产者-消费者模式(1)

    生产者-消费者模式在生活中非常常见.就拿我们去餐馆吃饭为例.我们会遇到以下两种情况: 1.厨师-客人 如下图所示,生产者.消费者直接进行交互. 生产者生产出产品后,通知消费者:消费者消费后,通知生产者 ...

  5. Java多线程_生产者消费者模式1

    生产者消费者模型       具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品.生产消费者模式如下图.(图片来自网络 ...

  6. Java设计模式之生产者消费者模式

    Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...

  7. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  8. 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...

  9. java多线程模拟生产者消费者问题,公司面试常常问的题。。。

    package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...

随机推荐

  1. 数据可视化之PowerQuery篇(十三)Power BI总计行错误,这个技巧一定要掌握

    https://zhuanlan.zhihu.com/p/102567707 ​前一段介绍过一个客户购买频次统计的案例: Power BI 数据分析应用:客户购买频次分布. 我并没有在文章中显示总计行 ...

  2. Python之堡垒机

    本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...

  3. 基于Python的HTTP接口自动化测试框架实现

    今天我们来讲一下基于Python的HTTP接口自动化测试框架的实现,范例如下: 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值 输出:XML文件 e ...

  4. kubernetes系列(十) - 通过Ingress实现七层代理

    1. Ingress入门 1.1 Ingress简介 1.2 原理和组成部分 1.3 资料信息 2. Ingress部署的几种方式 2.1 前言 2.1 Deployment+LoadBalancer ...

  5. c# Winfrom-DataGridView实现筛选功能

      //应对用户需求,需要在DataGridView中直接进行筛选功能,在网上找了一些代码加上自己修改整理过后的类,仅供参考! //上面代码可以直接创建类库项目生成DLL文件,下面代码为另外项目引用创 ...

  6. list基本使用

    list和vector的用法基本相同,区别如下: list可以头尾插入和删除,效率一样,vector只有尾部插入和删除效率才高,头部操作效率很低 list的排序有专有的接口,不能使用全局的接口,原因是 ...

  7. MySQL数据库---前言

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...

  8. consul++ansible+shell批量下发注册node_exporter

    --日期:2020年7月21日 --作者:飞翔的小胖猪  文档功能说明: 文档通过ansible+shell+consul的方式实现批量下发安装Linux操作系统监控的node_exporter软件, ...

  9. 题解 洛谷 P6378 【[PA2010]Riddle】

    首先不难看出对于本题的点与点之间的限制关系,我们可以考虑用\(2-SAT\)来解决,通过从状态\(x\)向状态\(y\)连一条有向边表示若状态\(x\)存在,那么状态\(y\)必须存在. 接下来的处理 ...

  10. 基于.Net Core的Redis实现查询附近的地理信息

    1.使用的Redis客户端为:ServiceStack.Redis 2.Redis 中的 GEORedis是我们最为熟悉的K-V数据库,它常被拿来作为高性能的缓存数据库来使用,大部分项目都会用到它.从 ...