包子类&包子铺类

资源类:包子类设置包子的属性


包子的状态:有true,没有false

package Demo01.WaitAndNotify;

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

/*
生产者(包子铺)类:是一个线程类,可以继承Thread设置线程任务(run ):生产包子
对包子的状态进行判断
true:有包子
包子铺调用wait方法进入等待状态false:没有包子
包子铺生产包子
增加一些趣味性:交替生产两种包子
有两种状态(i%2==0)
包子铺生产好了包子
修改包子的状态为true有
唤醒吃货线程,让吃货线程吃包子 */
public class BaoZuPu extends Thread {
private final BaoZi bz; public BaoZuPu(BaoZi bz) {
this.bz = bz;
} @Override
public void run() {
while (true) {
//定义一个变量
int count = 0;
//必须同时同步技术保证两个线程只能有一个在执行
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(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
//包子铺生产好了包子
//修改包子的状态为true有
bz.flag = true;
//唤醒吃货线程,让吃或线程吃包子
bz.notify();
System.out.println("包子铺已经生产好了:" + bz.pi + bz.xian + "包子,吃货可以开始了");
}
}
}
}

吃货类&测试类

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

/*
l.
消费者(吃货)类:是一个线程类,可以继承Thread设置线程任务(run):吃包子
对包子的状态进行判断
false:没有包子
吃货调用wait方法进入等待状态true:有包子
吃货吃包子吃货吃完包子
修改包子的状态为false没有吃货唤醒包子铺线程,生产包子 */
public class ChiHuo extends Thread {
private final BaoZi bz; public ChiHuo(BaoZi bz) {
this.bz = bz;
} //设置线程任务(run):吃包子
@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("----------------------------------------------------------"); }
} }
}
package Demo01.WaitAndNotify;
/*
测试类;
包含main方法,程序执行的入口,启动程序创建包子对象;
创建包子铺线程,开启,生产包子;创建吃货线程,开启,吃包子; */
public class Demo {
public static void main(String[] args) {
//创建包子对象
BaoZi bz = new BaoZi();
//创建包子铺线程,开启生产包子
new BaoZuPu(bz).start();
//创建吃货线程
new ChiHuo(bz).start();
}
}

包子类&包子铺类-吃货类&测试类的更多相关文章

  1. 等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类

    资源类:包子类 设置包子的属性 皮 陷 包子的状态:有 true 没有 false public class BaoZi { //皮 String pi; //陷 String xian; //包子的 ...

  2. Spring Boot超简单的测试类demo

    1 概述 Spring Boot结合Junit的简单测试类demo,流程是先引入依赖,接着编写测试类测试运行即可. 2 依赖 <dependency> <groupId>org ...

  3. Spring-test使用JUnit时,测试类autowired报错,create bean error

    Spring-test使用JUnit时,测试类里面使用autowired会报错, 报create bean error...... 但是controller里面@autowired可以正常运行的. 在 ...

  4. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  5. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  6. 在Eclipse中生成接口的JUnit测试类

    在Spring相关应用中,我们经常使用“接口” + “实现类” 的形式,为了方便,使用Eclipse自动生成Junit测试类. 1. 类名-new-Other-java-Junit-Junit Tes ...

  7. TestNG之执行测试类方式

    TestNG提供了很多执行方式,下面做简单介绍. 1.XML指明测试类,按照类名执行,其中可以指定包名,也可指定无包名: 带包名,运行ParameterSample类和ParameterTest类 & ...

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

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

  9. 各种数据库连接代码的测试类(java)

    测试类: public class Mytest { Connection conn=null; Statement stmt=null; String myDriver="com.mysq ...

随机推荐

  1. 想开发DAYU200,我教你

    摘要:本文主要介绍OpenHarmony富设备DAYU200开发板的入门指导. 本文分享自华为云社区<DAYU200开发指导>,作者: 星辰27. 1 概述 DAYU200开发板属于Ope ...

  2. java学习之爬虫

    0x00前言 对比与Python的爬虫机制和java的爬虫机制来详解一下java的爬虫,对于一般性的需求无论java还是python都可以胜任. 如需要模拟登陆.对抗防采集选择python更方便些,如 ...

  3. 27、求解n阶多项式的值,多项式公式如下

    /* 求解n阶多项式的值,多项式公式如下: Pn(x) = 1 n=0; = x n = 1; = (2n - 1)xPn-1(x) - (n - 1)Pn-2(x) n>=2 */ #incl ...

  4. centos8 telnet安装

    1. 装包 yum -y install telnet telnet-server 2. 启服务 systemctl enable telnet.socket --now 3. 防火墙开放端口 fir ...

  5. HDLBits答案——Verilog Language

    Verilog Language 1 Basics 1.1 Wire module top_module( input in, output out ); assign out = in; endmo ...

  6. 交叉编译:zlib,openSSL,openSSH

    1. 编译zlib wget https://www.zlib.net/zlib-1.2.12.tar.gz # 编译命令 export CC=arm-fullhanv3-linux-uclibcgn ...

  7. 基于 RocketMQ 的 Dubbo-go 通信新范式

    本文作者:郝洪范 ,Dubbo-go Committer,京东资深研发工程师. 一.MQ Request Reply特性介绍 什么是 RPC 通信? 如上图所示,类似于本地调用,A 服务响应调用 B ...

  8. Zabbix技术分享——监控windows进程资源使用情况

    监控系统进程资源的使用情况是IT运维的常规操作.在实际工作中,运维人员有可能遇到可以使用Zabbix Agent监控linux系统进程,却无法监控windows系统进程的情况.这是因为Zabbix A ...

  9. 【SQL】DML语句-SQL更新与删除:单表更新删除与连表更新删除语法

    〇.概述 1.资料 sql连表删除:http://www.lanxinbase.com/?tag=sql%E8%BF%9E%E8%A1%A8%E5%88%A0%E9%99%A4 sql实现两表关联更新 ...

  10. 漫谈计算机网络:番外篇 ------网络安全相关知识——>公钥与私钥、防火墙与入侵检测

    <漫谈计算机网络>上次已经完结啦,今天出一个番外篇! 2022-12-06 今天我们来聊一聊网络安全 废话不多说直接进入正题 网络安全问题概述 计算机网络面临的安全性威胁 两大类威胁:被动 ...