等待唤醒案例分析和等待唤醒案例代码实现

案例分析

 

 

 等待唤醒案例代码实现

 等待唤醒案例:线程之间的通信
   创建一个顾客线程(消费者):告知老板要的包子种类和数量,调用wait方法,放弃cpu的执行
   进入到WAITTING状态(无限等待)
   创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify()方法,唤醒顾客吃包子
 注意:
   顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
   同步使用的锁对象必须保证唯一
   只有锁对象才能调用wait和notify方法
 Object 类中的方法
 void wait()
   在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
 void notify()
   唤醒在此对象监视器上等待的单个线程
   会继续执行wait方法之后的代码

复制代码
public class Demonotyfi {
    public static void main(String[] args) {
        //创建锁对象,保证唯一
        Object obj = new Object();
        //创建一个顾客线程(消费者)
        new Thread(){
            @Override
            public void run() {
                //保证等待和唤醒的线程只能有一个执行,需要使用同步技术
                synchronized (obj){
                    System.out.println("告知老板要的包子种类和数量");
                    //调用wait()方法,放弃cpu的执行,进入到WAITTIN状态(无限登陆)
                    try
                    {
                        obj.wait();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }

                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                //花5秒中做包子
                try{
                    Thread.sleep(5000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                //保证等待和唤醒的线程只能有一个执行,需要使用同步技术
                synchronized (obj){
                    System.out.println("做包子");
                    //做好包子,唤醒调用notify方法,唤醒顾客吃包子
                    try{
                        obj.notify();
                    }catch (IllegalAccessError e){
                        e.printStackTrace();
                    }
                    System.out.println("开吃");
                }
            }
        }.start();
    }
}
复制代码

 

posted @   夫君  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示