资源类:包子类 
设置包子的属性
  皮
  陷
  包子的状态:有 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. Spring 源码(5)BeanFactory使用的准备及自定义属性值解析器

    BeanFactory 使用前的准备 上一篇文章 https://www.cnblogs.com/redwinter/p/16165878.html 介绍了自定义标签的使用,完成了AbstractAp ...

  2. FreeRTOS --(1)链表

    转载自 https://blog.csdn.net/zhoutaopower/article/details/106550648 Based On FreeRTOS Kernel V10.3.1 1. ...

  3. create-react-app的TS支持以及css模块化

    开始: 利用官方脚手架,搭建react工程.参考:https://react.docschina.org/docs/create-a-new-react-app.html. 过程: 1.暴露webpa ...

  4. [笔记] 2-sat

    定义 简单的说就是给出 \(n\) 个集合,每个集合有两个元素,已知形如选 \(a\) 则必须选 \(b\) 的若干个条件, 问是否存在从每个集合选择一个元素满足条件的方案,通常可以题目只要求任意一种 ...

  5. 文本框字符限制、focus光标定位

    一.为一个元素的所有子元素设置统一样式:.className * { color: #6666 } 二.正则表达式: 1.去除所有HTML标签只保留文字: /<\/?.+?\/?>/2.去 ...

  6. Python | 内置函数(BIF)

    Python内置函数 | V3.9.1 | 共计155个 还没学完, 还没记录完, 不知道自己能不能坚持记录下去 1.ArithmeticError 2.AssertionError 3.Attrib ...

  7. TS 自学笔记(二)装饰器

    TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...

  8. 709. To Lower Case - LeetCode

    Question 709. To Lower Case Sollution 题目大意:字符串大写转小写 思路: 直接调用Java API函数 字符串转char数组,遍历数组,判断如果大写就转小写 Ja ...

  9. 归约与分组 - 读《Java 8实战》

    区分Collection,Collector和collect 代码中用到的类与方法用红框标出,可从git库中查看 收集器用作高级归约 // 按货币对交易进行分组 Map<Currency, Li ...

  10. 好客租房32-事件绑定this指向(class实例方法)

    class实例方法 利用箭头函数的class实例方法 //导入react import React from 'react'   import ReactDOM from 'react-dom' // ...