赞
踩
* ==没有==包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态==有==
* ==有==包子-->包子铺线程唤醒吃货线程-->包子铺线程等待-->吃货线程吃包子-->修改包子的状态==没有==
* ==没有==包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态==有==
* ...
//定义一个包子类:BaoZi.java
/*
包子类
属性:
皮
馅
包子的有无状态:true,false
*/
public class BaoZi {
//皮
String pi;
//馅
String xian;
//包子的有无状态:true,false,初始为false
boolean flag = false;
}
//定义一个包子铺类来继承Thread:BaoZiPu.java
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让包子铺一直生产包子
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();
}
//包子铺生产好包子后,将包子状态修改为有
bz.flag = true;
//唤醒吃货线程,让吃货线程吃包子
bz.notify();
System.out.println("包子铺已经生产好了:" + bz.pi + bz.xian + "的包子,吃货可以开始吃了");
}
}
}
}
//定义一个吃货类来继承Thread:ChiHuo.java
public class ChiHuo extends Thread{
//1. 需要在成员位置创建一个变量
private BaoZi bz;
//2. 使用带参构造方法,为这个包子变量赋值
public ChiHuo(BaoZi bz) {
this.bz = bz;
}
//重写线程任务run:吃包子
@Override
public void run() {
//while让吃货一直吃包子
while (true){
//同步技术,保证两个线程只有一个在执行
synchronized(bz) { //同步代码块的锁对象就用包子对象
//对包子的状态进行判断
if(bz.flag == false){
//吃货调用wait方法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒之后执行的代码,吃包子
System.out.println("吃货正在吃" + bz.pi + bz.xian + "的包子");
//吃货吃完包子后,将包子状态修改为无
bz.flag = false;
//唤醒包子铺线程,让包子铺生产包子
bz.notify();
System.out.println("吃货已经把:" + bz.pi + bz.xian + "的包子吃完了,包子铺开始生产包子");
System.out.println("=======================");
}
}
}
}
//主方法(测试类):Demo.java
public static void main(String[] args) {
//创建包子对象
BaoZi bz = new BaoZi();
//创建包子铺线程,开启,生产包子
new BaoZiPu(bz).start();
//创建吃货线程,开启,吃包子
new ChiHuo(bz).start();
}
//结果:
包子铺正在生产薄皮三鲜馅的包子
包子铺已经生产好了:薄皮三鲜馅的包子,吃货可以开始吃了
吃货正在吃薄皮三鲜馅的包子
吃货已经把:薄皮三鲜馅的包子吃完了,包子铺开始生产包子
=======================
包子铺正在生产冰皮牛肉大葱馅的包子
包子铺已经生产好了:冰皮牛肉大葱馅的包子,吃货可以开始吃了
吃货正在吃冰皮牛肉大葱馅的包子
吃货已经把:冰皮牛肉大葱馅的包子吃完了,包子铺开始生产包子
=======================
包子铺正在生产薄皮三鲜馅的包子
...
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。