主代码
//创建一个包子对象
static Baozi baozi = new Baozi();
static int count = 0;//设置一个变量用于判断生产包子的种类
public static void main(String[] args) {
//设置包子铺线程:对包子的状态进行判断。
// 1、true:有包子,那么唤醒消费者线程吃包子,包子铺进入wait状态。
// 2、false:没包子,那么就进行制作包子,增加一些趣味性:生产两种包子。包子铺生产好包子,包子状态为true,唤醒吃货线程吃包子
new Thread(){
//设置线程任务,生产包子
@Override
public void run() {
while (true) {
synchronized (baozi) {
if (baozi.flag) {
try {
baozi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
if (count % 2 == 0) {
baozi.pi = "薄皮";
baozi.xier = "三鲜";
} else {
baozi.pi = "冰皮";
baozi.xier = "牛肉粉条";
}
count++;
System.out.println("包子铺正在生产:" + baozi + "包子");
//生产包子需要5秒钟
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生产好包子,设置包子状态为有
baozi.flag = true;
//唤醒吃货线程
baozi.notify();
System.out.println("包子铺已经生产好了" + baozi + "包子,吃货可以开始吃了");
}
}
}
}
}.start();
//创建吃货线程:首先判断包子状态:
// 1.true 有包子,吃货开始吃包子,包子铺线程休眠,吃完包子后唤醒包子铺线程
// 2.false 没有包子,吃货线程进入等待,包子铺线程开始生产包子,生产完毕后唤醒吃货线程
new Thread(){
@Override
public void run() {
while (true){
synchronized (baozi){
//有包子,吃货吃包子,吃包子需要5秒钟
if (baozi.flag){
System.out.println("吃货正在吃"+baozi+"包子");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("吃货已经吃完包子了");
//吃完包子,唤醒包子铺线程
baozi.flag = false;
baozi.notify();
}
//没有包子,唤醒包子铺线程生产包子,吃货进入休眠
else{
try {
baozi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒包子铺线程生产包子
baozi.notify();
}
}
}
}
}.start();
}
包子类代码:(为了方便输出重写了toString方法)
public class Baozi {
String pi;
String xier;
boolean flag = false;//包子初始状态为false
public Baozi() {
}
public Baozi(String pi, String xier) {
this.pi = pi;
this.xier = xier;
}
@Override
public String toString() {
return pi + xier;
}
}