![]() |
#2
huang12312020-02-05 13:27
回复 楼主 huang1231
|
求哪位大神帮我看看,为什么我程序运行的时候,只能循环一两次就不行了,上网查了查,说是死锁了。求解!!!
包子属性:

package cn.hxl.day17;
/*
设置包子的属性
皮
馅
包子的状态,有为true,没有为false
*/
public class baozi {
// 皮
String pi;
// 馅
String xian;
// 包子的状态,默认为没有
boolean flag = false;
}
/*
设置包子的属性
皮
馅
包子的状态,有为true,没有为false
*/
public class baozi {
// 皮
String pi;
// 馅
String xian;
// 包子的状态,默认为没有
boolean flag = false;
}
包子铺类:

package cn.hxl.day17;
/*
包子铺线程类的实现,,继承Thread
*/
public class baozipu extends Thread {
// 创建一个包子类型的变量
private baozi bz;
// 使用带有参数的构造方法,给包子变量赋值
public baozipu(baozi bz) {
this.bz = bz;
}
// 设置线程任务(run)用变量bz作为锁对象
@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
*/
public class baozipu extends Thread {
// 创建一个包子类型的变量
private baozi bz;
// 使用带有参数的构造方法,给包子变量赋值
public baozipu(baozi bz) {
this.bz = bz;
}
// 设置线程任务(run)用变量bz作为锁对象
@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 + "的包子了,吃货可以开始吃了");
}
}
}
}
吃包子类:

package cn.hxl.day17;
/*
吃货类的实现,线程类,继承与Thread
*/
public class chihuo extends Thread {
// 定义一个包子类型的变量
private baozi bz;
// 使用带有参数的构造方法,给包子变量赋值
public chihuo(baozi bz) {
this.bz = bz;
}
// 重写run方法,设置线程任务
@Override
public void run() {
//使用死循环,让吃货一直吃包子
while(true){
// 两个线程类必须使用同一个锁对象
synchronized (bz){
// 判断有没有包子(没有)
if(bz.flag==true){
//被唤醒 吃货吃包子
System.out.println("吃货开始吃"+bz.pi+bz.xian+"的包子");
//吃完包子,修改包子的状态
// 并且唤醒包子铺
bz.flag=false;
bz.notify();
System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子");
System.out.println("========================================================");
}
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/*
吃货类的实现,线程类,继承与Thread
*/
public class chihuo extends Thread {
// 定义一个包子类型的变量
private baozi bz;
// 使用带有参数的构造方法,给包子变量赋值
public chihuo(baozi bz) {
this.bz = bz;
}
// 重写run方法,设置线程任务
@Override
public void run() {
//使用死循环,让吃货一直吃包子
while(true){
// 两个线程类必须使用同一个锁对象
synchronized (bz){
// 判断有没有包子(没有)
if(bz.flag==true){
//被唤醒 吃货吃包子
System.out.println("吃货开始吃"+bz.pi+bz.xian+"的包子");
//吃完包子,修改包子的状态
// 并且唤醒包子铺
bz.flag=false;
bz.notify();
System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子");
System.out.println("========================================================");
}
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
主程序:

package cn.hxl.day17;
/*
测试类,主程序调用两个类
*/
public class usebaozi {
public static void main(String[] args) {
// 创建包子对象
baozi bz = new baozi();
// 创建包子铺线程对象,传递包子对象
new baozipu(bz).start();
// 创建吃货线程对象,传递包子对象
new chihuo(bz).start();
}
}
/*
测试类,主程序调用两个类
*/
public class usebaozi {
public static void main(String[] args) {
// 创建包子对象
baozi bz = new baozi();
// 创建包子铺线程对象,传递包子对象
new baozipu(bz).start();
// 创建吃货线程对象,传递包子对象
new chihuo(bz).start();
}
}