包子线程问题

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();
}
}

显示效果:

包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子

包子铺正在生产:冰皮牛肉大葱馅包子
包子铺已经生产好了:冰皮牛肉大葱馅包子,吃货可以吃了!
吃货正在吃:冰皮牛肉大葱馅包子
吃货吃完了:冰皮牛肉大葱馅包子,包子铺开始生产包子

包子铺正在生产:薄皮三鲜馅包子
包子铺已经生产好了:薄皮三鲜馅包子,吃货可以吃了!
吃货正在吃:薄皮三鲜馅包子
吃货吃完了:薄皮三鲜馅包子,包子铺开始生产包子

猜你喜欢

转载自blog.csdn.net/tangshuai96/article/details/102631560