做买包子案例:等待唤醒wait

package com.chunzhi.Test10WaitAndNotify;
/*
    等待唤醒案例:线程之间的通信
        创建一个顾客线程:告知老板要的包子种类和数量,调用wait方法,放弃cpu执行权,进入到WAITING状态(无限等待)
        创建一个老板线程:花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子
 */
public class Test01WaitAndNotify {
    public static void main(String[] args) {
        // 创建一个锁对象
        Object obj = new Object();

        // 创建匿名顾客线程
        new Thread() {
            @Override
            public void run() {
               while (true) {
                   // 保证等待和唤醒的线程只能有一个执行,需要使用同步技术
                   synchronized (obj) {
                       System.out.println("告知老板包子的种类和数量");
                       // 进行线程等待,等待老板做包子
                       try {
                           obj.wait();
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                       // 被notify方法唤醒后执行的代码
                       System.out.println("顾客开始吃包子");
                       System.out.println("------------------");
                   }
               }
            }
        }.start();

        // 创建匿名老板线程
        new Thread() {
            @Override
            public void run() {
               while (true) {
                   // 做包子需要3秒钟
                   try {
                       Thread.sleep(3000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   // 保证等待和唤醒的线程只能有一个执行,需要使用同步技术
                   synchronized (obj) {
                       System.out.println("老板花了3秒做好了包子,可以开吃了");
                       // 包子做好后,使用notify方法唤醒顾客吃包子
                       obj.notify();
                   }
               }
            }
        }.start();
    }
}

 

posted @ 2020-11-14 17:19  春志  阅读(107)  评论(0)    收藏  举报