JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类
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多线程之生产者 消费者模式 妈妈做面包案例的更多相关文章
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
- Java多线程-----实现生产者消费者模式的几种方式
1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
- Java多线程编程——生产者-消费者模式(1)
生产者-消费者模式在生活中非常常见.就拿我们去餐馆吃饭为例.我们会遇到以下两种情况: 1.厨师-客人 如下图所示,生产者.消费者直接进行交互. 生产者生产出产品后,通知消费者:消费者消费后,通知生产者 ...
- Java多线程_生产者消费者模式1
生产者消费者模型 具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品.生产消费者模式如下图.(图片来自网络 ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
随机推荐
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛*
bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛 题意: 依次给出n只奶牛的产奶时间段,求最大的k使得前k只奶牛不存在一个时间段被另一个时间段完全覆盖的情况.n≤1 ...
- Python Ethical Hacking - VULNERABILITY SCANNER(5)
EXPLOITATION - XSS VULNS XSS - CROSS SITE SCRIPTING VULNS Allow an attacker to inject javascript cod ...
- SpringBoot2 整合FreeMarker模板,完成页面静态化处理
本文源码:GitHub·点这里 || GitEE·点这里 一.页面静态化 1.动静态页面 静态页面 即静态网页,指已经装载好内容HTML页面,无需经过请求服务器数据和编译过程,直接加载到客户浏览器上显 ...
- 深入理解JVM(一)Java内存区域
运行时数据区 程序计数器 当前线程执行的字节码的行号指示器 每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储. 如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置: ...
- asp.net core 3 使用nlog日志组件,使用$ {basedir}保存位置不对,记录下怎么解决
$ {basedir}指向的是 AppDomain.CurrentDomain.BaseDirectory, Asp.Net.Core的解决方法可能如下(在Program.cs中添加两行): var ...
- leetcode题库练习_两数之和
题目:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能 ...
- 手动触发浏览器resize
今天做echarts图表 发现饼图不能居中,resize之后才会居中. 于是想手动触发resize方法,但是不改变浏览器窗口 JQ $(window).trigger('risize'); JS ...
- 洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解
题目描述 分析 先放一张图便于理解 这一道题如果暴力建图会被卡成\(n^{2}\) 实际上,在我们暴力建图的时候,有很多边都是重复的 假如一行当中有许多横天门的话,我们就不必要把这一行当中的所有点和每 ...
- 一个edit的学习笔记
https://blog.csdn.net/woshizoe/article/details/51555396