JAVA多线程等待唤醒机制的小练习
场景概述:
包子铺(生产者)制作两种皮和馅的包子,每5秒制作一个包子,随机皮馅,在包子铺制作包子的线程中,顾客(消费者)无限等待(wait),直到包子制作完成后唤醒(notify)顾客进行吃包子进程。
JAVA知识:
主要练习JAVA多线程的等待唤醒机制。
代码如下:
第一部分是包子类的创建,这个类对象是两个线程共享的数据,所以需要做线程安全方便调用。
public class baozi {
String pi;
String xian;
boolean flag=false;
}
第二部分是包子铺类的创建,也就是制作包子的进程
public class baozipu extends Thread {
private baozi bz;
int count=1;
public baozipu(baozi bz) {
super();
this.bz = bz;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (bz) {
if(bz.flag==true){
try {
bz.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(count%2==0){
bz.pi="薄皮";
bz.xian="猪肉韭菜";
}else{
bz.pi="冰皮";
bz.xian="豆沙";
}
System.out.println("包子铺正在制作:"+bz.pi+bz.xian+"包子!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(bz.pi+bz.xian+"包子已经制作完成!");
bz.flag=true;
count++;
bz.notify();
System.out.println("#####################################################");
}
}
}
}
第三部分是吃货顾客的类,也就是吃包子的进程。
public class chihuo extends Thread{
private baozi bz;
int count=1;
public chihuo(baozi bz) {
super();
this.bz = bz;
}
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (bz) {
if(bz.flag==false){
try {
bz.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("吃货正在吃"+bz.pi+bz.xian+"包子!");
bz.flag=false;
bz.notify();
System.out.println("#####################################################");
}
}
}
}
第四部分是demo测试效果主线程类:
public class demo {
public static void main(String[] args) {
baozi bz = new baozi();
new baozipu(bz).start();
new chihuo(bz).start();
}
}
运行效果图如下: