等待唤醒机制代码实现 包子类

notify方法只是唤醒了其他线程并不代表能立马切换到其他线程里面,没有死循环的条件下此线程运行结束才会轮到其他线程执行,有死循环的条件下遇见wait方法才会进入等待状态立马跳出执行其他线程  以下代码 自己写的参考参考

 创建共享数据类 也是锁对象里面的内容提前设置好



public class FuXi2 {//创建共享数据   顾客和包子铺都需要这些数据
        String xian;
        String pi;
        boolean hava=false;
    }


 创建顾客线程


//顾客线程
//注意:|||代表分割线
public class FuXi3 extends Thread {
    private FuXi2 fuXi2;//引用类型 定义一个变量把这个对象类里面的数据方法引用过来,同时作为锁对象

    public FuXi3(FuXi2 fuXi2) {//放入指定类型的数据
        this.fuXi2 = fuXi2;//设定本类引用数据类型变量为放入的指定引用数据类型变量
    }

    @Override
    public void run() {
        while (true){//注意这里是个死循环  不经过wait方法不会停止|||死循环第二次执行
        synchronized (fuXi2) {//设置线程安全问题 一个一个线程执行下列方法  锁对象为fuxi2  |||第二次执行
            System.out.println("来两个包子");
            try {
                fuXi2.wait();//进入等待切换包子铺|||第二次执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {//从上往下执行没有其他线程可以执行。于是此线程开始执行|||第二次执行
                Thread.sleep(2000);//等待2秒钟|||第二次执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(fuXi2.xian+fuXi2.pi+"的包子吃到了味道不错");//
            fuXi2.hava=false;//吃掉了包子 设置包子为false值 因为包子没有了|||第二次执行
            fuXi2.notifyAll();//释放所有线程都可执行|||第二次执行
        }
    }
}
}




 创建包子铺线程


//切换包子铺
public class Person extends Thread {

    private FuXi2 fuXi2;//引用类型 定义一个变量把这个对象类里面的数据方法引用过来,同时作为锁对象

    public Person(FuXi2 fuXi2) {//放入指定类型的数据
        this.fuXi2 = fuXi2;//设定本类引用数据类型变量为放入的指定引用数据类型变量
    }

    @Override
    public void run() {//店铺生产包子
        int a = 0;
        synchronized (fuXi2) {//设置线程安全问题 一个一个线程执行下列方法  锁对象为fuxi2
            while (true) {//注意这里是个死循环  不经过wait方法不会停止 |||  又一轮循环此时包子铺为true有包子了
                if (fuXi2.hava == false) {//判断包子铺是否没有包子
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (a % 2 == 0) {//没有包子执行下面代码
                        fuXi2.xian = "三鲜馅";//套餐1
                        fuXi2.pi = "饺子皮";
                    } else if (a % 2 == 1) {//套餐2
                        fuXi2.xian = "韭菜馅";
                        fuXi2.pi = "馄饨皮";
                    }
                    System.out.println("正在生产您所需要的包子");
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    fuXi2.hava = true;//做好了有包子了 设置包子库存为true
                    a++;//随机套餐索引+1
                    fuXi2.notify();//解锁另一个等待的线程
                    System.out.println(fuXi2.xian + fuXi2.pi + "的包子做好了");
                } else try {//有包子的话执行|||执行此代码
                    fuXi2.wait();//进入等待线程其他线程执行|||从上往下执行没有其他线程可以执行,于是此线程开始执行,并且由于其他线程已经释放锁对象 所以继续执行下方代码
                    System.out.println("早就准备好了给您");//打印结果告知顾客
                    fuXi2.notify();//唤醒某个等待时间长的线程
                    fuXi2.wait();//进入等待状态 其他线程执行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

测试类开始测试



public class FuXi4 extends Thread {
    public static void main(String[] args) {
        FuXi2 a = new FuXi2();
        Person a1 = new Person(a);
        FuXi3 a2 = new FuXi3(a);
        a2.start();//运行多线程执行run方法
        a1.start();//运行多线程执行run方法



    }
    }





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值