资源类:包子类 
设置包子的属性
  皮
  陷
  包子的状态:有 true 没有 false
public class BaoZi {
//皮
String pi;
//陷
String xian;
//包子的状态,有 true ,没有 false,设置初始值为false没有包子
boolean flag = false; }

生产者(包子铺)类:是一个线程类,可以继承Thread
设置线程任务(run):生产包子
  对包子的状态进行判断
  true:有包子
    包子铺调用wait方法进入等待状态
  false:没有包子
    包子铺生产包子
    增加一些趣味性:交替生产两种包子
      有两种状态(i%2 ==0):
    包子铺生产好了包子
    修改包子额状态为true:有
    唤醒吃货线程,让吃货线程吃包子
注意:
  包子铺线程和包子线程关系 --> 通信(互斥)
  必须同时同步技术保证两个线程只能有一个在执行
  锁对象必须保证唯一,可以使用包子对象作为锁对象
  包子铺类和吃货的类必须把包子对象作为参数传递进来
    1.需要在成员位置创建一个包子变量
    2.使用带参数构造方法,为这个包子变量赋值

public class BaoZiPu extends Thread {
//1.需要在成员位置创建一个包子变量
private BaoZi bz; //2.使用带参数构造方法,为这个包子变量赋值
public BaoZiPu(BaoZi bz) {
this.bz = bz;
} //重写run方法,目的就是生产包子
@Override
public void run() {
//定义一个变量
int count = 0;
//增加一个死循环,反复执行,让包子铺一直生产包子
while (true) {
//必须同时同步技术保证两个线程只能有一个在执行
synchronized (bz) {
//对包子的状态进行判断
if (bz.flag == true) {
//包子铺调用wait方法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒之后执行,包子铺生产包子
//增加一些趣味性:交替生产两种包子
if (count % 2 == 0) {
//生产 薄皮肉馅包子
bz.pi = "薄皮";
bz.xian = "肉馅";
} else {
//生产 冰皮奶黄包子
bz.pi = "冰皮";
bz.xian = "奶黄";
}
count++;
System.out.println("包子铺正在生产" + bz.pi + bz.xian + "包子");
//生产包子需要3秒钟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//包子铺生产好了包子,修改包子额状态为true:有
bz.flag = true;
//唤醒吃货线程,让吃货线程吃包子
bz.notify();
System.out.println("包子铺已经生产好了" + bz.pi + bz.xian + "包子,吃货可以开吃了");
}
}
}
}

消费类 ( 吃 货 )类:是一个线程类,可以继承Thread
设置线程任务(run):吃包子
  对包子的状态进行判断
  false:没有包子
    吃货线程调用wait方法进入等待状态
  true:有包子
    吃货吃包子
    吃货吃完包子
    修改包子的状态为false 没有
    吃货唤醒包子铺线程,生产包子

public class ChiHuo extends Thread {
//1.需要在成员位置创建一个包子变量
private BaoZi bz; //2.使用带参数构造方法,为这个包子变量赋值
public ChiHuo(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
//使用死循环,让吃货一直吃包子
while (true) {
//必须同时同步技术保证两个线程只能有一个在执行
synchronized (bz) {
//对包子的状态进行判断
if (bz.flag == false) {
//吃货线程调用wait方法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒之后执行的代码,吃包子
System.out.println("吃货正在吃" + bz.pi + bz.xian + "吃包子");
//吃货吃完包子,修改包子的状态为false 没有
bz.flag = false;
//吃货唤醒包子铺线程,生产包子
bz.notify();
System.out.println("吃货已经把" + bz.pi + bz.xian + "包子吃完了,包子铺可以开生产包子了");
System.out.println("----------------------------------------------"); }
}
}
}

测试类:

  包含main方法,程序执行的入口,启动程序

  创建包子对象,创建包子铺线程,生产包子

   创建吃货线程,开启,吃包子

public class Demo {
public static void main(String[] args) {
//创建包子类对象,
BaoZi bz = new BaoZi();
//创建包子铺线程,生产包子
new BaoZiPu(bz).start();
//创建吃货线程,吃包子
new ChiHuo(bz).start();
}
}

等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类的更多相关文章

  1. 创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了; 如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变

    i汽车类 package com.lanxi.demo2_3; public class Car { private String name; private int price; @Override ...

  2. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  3. 15.junit测试类使用及注解

    1.junit简介 JUnit是一个Java语言的单元测试框架,可以大大缩短你的测试时间和准确度.多数Java的开发环境都已经集成了JUnit作为单元测试的工具. 2.实现junitDemo示例 2. ...

  4. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

  5. ReflectUitls类的编写和对反射机制的解析

    ReflectUitls类的编写和对反射机制的解析 反射相关的类 反射相关的类,最基本的当然是Class类. 获取了Class对象之后,就可以接着生成对象实例.调用方法.查看字段等等. 字段(Fiel ...

  6. 并发工具类(一)等待多线程的CountDownLatch

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  7. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. C# 语言规范_版本5.0 (第18章 不安全代码)

    1. 不安全代码 **(注:此章对于跨多语言编程开发非常重要,如遇异常无法完成跨语言,建议使用此种方式.) 如前面几章所定义,核心 C# 语言没有将指针列入它所支持的数据类型,从而与 C 和 C++ ...

随机推荐

  1. 05. 树莓派初始配置——开启VNC远程桌面

    开启VNC远程桌面 不插显示器就可以看到树莓派系统界面的方式. 1. 如果你下的系统镜像有包含一些基本软件(Raspberry Pi OS with desktop and recommended s ...

  2. python学习-Day6

    目录 学习内容详述 上期 '猜年龄'练习详解: while循环补充 while + else 死循环与while的嵌套 while嵌套 for循环 range关键字 range用法 什么是爬虫??? ...

  3. CentOS 8迁移Rocky Linux 8手记

    前言 由于CentOS 8的支持已经到期了,.NET 6也不支持了,然后也无法升级,导致使用起来已经非常不便,无奈只有迁移服务器这个选项了. 选择发行版本一直是一个比较头疼的问题,首先我不是专门运维的 ...

  4. Kubernetes生产环境最佳实践

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 众所周知,Kubernetes很难! 以下是在生产中使用 ...

  5. font-family样式对照表

    .a { font-family: "微软雅黑" } .b { font-family: "黑体" } .c { font-family: "楷体&q ...

  6. go thrift 开发

    thrift 从 0.9.1版本开始,可以完美支持 go 语言,可以完美的实现跨语言的 rpc 调用了.下面以 go 和 java 语言相互调用为例. 编辑协议文件,go 语言示例 /** examp ...

  7. 五、C++运算符重载,使面向对象编程更方便

    复数类CComplex 编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法):如果没有成员方法,就砸全局作用域找合适的运算符重载函数 ++和--运算符是单目运算符,在参数列表里放上一 ...

  8. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

  9. Kafka到底有多高可靠?(RNG NB)

    在聊Kafka高可靠之前,先在评论区来波RNG NB好不好! 什么叫可靠性? 大家都知道,系统架构有三高:「高性能.高并发和高可用」,三者的重要性不言而喻. 对于任意系统,想要同时满足三高都是一件非常 ...

  10. Eoapi — 一个可拓展的开源 API 工具

    ​ 在社区中时常会出现"抱怨某商业产品越来越臃肿"的声音,API 工具也是如此.从最早期只做 API 调试的工具,到经过多年的演进后集成全面功能的"庞然大物", ...