Thread包子线程
创建包子对象
含有:皮,馅,包子的状态:有true,,没有false
代码:
public class BaoZi {
String pi;
String xian;
boolean flag=false;
}
创建包子生产者进程
生产者(包子铺)类是一个线程类,可以继承Thread
设置线程任务run:生产包子
对包子的状态进行判断
true:有包子
包子铺调用wait方法进入等待状态
false:没有包子
包子铺生产包子
增加一些趣味性:交替生产两种包子(i%2==0)
包子生产好了包子
修改包子状态为true唤醒吃货进程:让吃货开始吃包子
注意:
- 包子铺线程和包子线程关系------通信(互斥)
- 必须同时同步保证两个线程只有一个在执行
- 锁对象必须保证唯一,可以使用包子对象为锁对象
- 包子铺类和吃货类就需要将包子对象作为传递参数传递过来
1.需要在成员位置创建一个包子遍历
2.使用带参数的构造方法,为这个包子变量赋值
代码:
public class BaoZiPu extends Thread {
private BaoZi bz;
public BaoZiPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
int count=0;
while (true)
{
synchronized (bz)
{
//对包子状态进行判断
if(bz.flag==true) {//有包子就等待
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
设置线程任务(run):吃包子
对包子的状态进行判断
false没有包子
吃货调用wait方法进入等待
true有包子
吃货吃包子,吃完包子,修改包子的状态为false没有,吃货唤醒包子铺线程,生产包子
代码:
public class ChiHuo extends Thread{
private BaoZi bz;
public ChiHuo(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
while (true)
{
synchronized (bz){
if(bz.flag==false) {//包子没有,顾客等待
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("-----------------------------------------------------");
}
}
}
}
创建测试类:
void wait()
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
void notify()
唤醒正在等待对象监视器的单个线程。
void notifyAll()
唤醒正在等待对象监视器的所有线程。
void wait(long timeout)
导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。 过了这段时间自动唤醒自己
代码:
public class DemoTest {
public static void main(String[] args) {
BaoZi bz=new BaoZi();
//创建包子铺进程,开始生产包子;
new BaoZiPu(bz).start();
//创建吃货进程,开启,吃包子
new ChiHuo(bz).start();
}
}
显示效果:
包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子
包子铺正在生产:冰皮牛肉大葱馅包子
包子铺已经生产好了:冰皮牛肉大葱馅包子,吃货可以吃了!
吃货正在吃:冰皮牛肉大葱馅包子
吃货吃完了:冰皮牛肉大葱馅包子,包子铺开始生产包子
包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子