等待与唤醒机制之间的通信:

等待与唤醒机制之间的通信:

重点:有效的利用资源资源((生产者)包子先生与(消费者)吃货包子案例)

通信:对包子的状态进行判断:

—没有包子–吃货先生唤醒包子先生–吃货先生等待包子(wait --wait set–在等待机制中,不会占用CPU资源)–包子先生做包子–包子先生做好包子—包子先生修改包子状态为有包子

—有包子—包子先生唤醒吃货先生吃包子(notify–)----包子先生停止做包子—吃货包子吃包子–吃货吃完包子–修改包子的状态为没有包子

wait/notify:他们在同一个机制中,不能同时用(抽象里面的必须重写)

资源类需要哪些类?

包子与包子铺案例

包子类:(属性:皮,陷)

包子状态:有true,没有false:

生产者(包子铺类)是一个线程类,可以继承Threa,

设置线程任务:生产包子,对包子状态进行判断,

ture:有包子包子铺进入wait方法进入等待状态

false:没有包子

包子铺生产包子;

增加一些趣味:交替生产两种包子

两种状态(i%20(i模2等等于0),i%21(i模2等等1))

包子铺生产好包子

修改状态为true有

修改好之后唤醒吃货线程吃包子

消费者也是一个线程,也可以继承Thread

设置线程任务(run):吃包子

对包子状态进行判断

false:没有包子

等待调用wait进入等待状态

true:有包子,吃包子,吃完包子修改包子状态为false没有

唤醒包子铺先生生产包子

测试类:包含main方法的类,启动程序

创建包子对象

开启包子铺线程(生产),开启吃货线程(吃)

代码实现:
//包子铺类
public class productBZ extends Thread {
    private baozi bz;

    public productBZ(String name, baozi bz) {
        super(name);
        this.bz = bz;
    }

    @Override
    public void run() {
        int count = 0;
        while (true) {
            synchronized (bz) {
                if (bz.State ==true) {
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                //没有包子
                //被唤醒了之后,包子铺开始生产包子
                System.out.println("包子铺做包子");
                if (count % 2 == 0) {
                    bz.setBaozipi("薄皮");
                    bz.setBaozixian("三鲜肉");
                    System.out.println(getName() + bz.getBaozipi() + bz.getBaozixian() + "包子");
                } else {

                    bz.setBaozipi("冰皮");
                    bz.setBaozixian("牛肉馅");
                    System.out.println("包子铺生产了" + bz.getBaozipi() + bz.getBaozixian() + "包子");
                }
                count++;
                System.out.println("包子铺做好了包子,修改包子状态为有");
                bz.State=true;
                System.out.println("包子铺唤醒吃货,吃货可以开吃啦!");
                bz.notify();


            }
        }
    }
}
//吃货类
public class eatBZ extends Thread{
    private  baozi bz;

    public eatBZ(String name, baozi bz) {
        super(name);
        this.bz = bz;
    }

    @Override
    public void run() {
        while (true){

                synchronized (bz){
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (bz.State==true) {
                        System.out.println("吃包子");
                        System.out.println("吃完包子");
                        bz.State=false;
                        System.out.println("吃货唤醒包子铺生产包子");
                        bz.notify();
                        System.out.println("----------------");
                    }
                    else {
                        //没有包子处于等待状态
                        try {
                            bz.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

}
//包子类
public class baozi {
    private String baozixian;
    private String baozipi;
    int count = 0;
    //初始状态为:没包子
    boolean State = false;

    public boolean isState() {
        return State;
    }

    public void setState(boolean state) {
        State = state;
    }

    public baozi(String baozixian, String baozipi, boolean state) {
        this.baozixian = baozixian;
        this.baozipi = baozipi;
        State = state;
    }


    public baozi() {
    }

    public String getBaozixian() {
        return baozixian;
    }

    public void setBaozixian(String baozixian) {
        this.baozixian = baozixian;
    }

    public String getBaozipi() {
        return baozipi;
    }

    public void setBaozipi(String baozipi) {
        this.baozipi = baozipi;
    }
}

//测试类
public class demoBaozi {
    public static void main(String[] args) {
        baozi bz=new baozi();
        productBZ p=new productBZ("包子铺",bz);
        p.start();

        eatBZ e=new eatBZ("吃货",bz);
        e.start();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值