等待喚醒案例代碼實現

代碼:

package demo06.waitAndNotify;

/**
 * @Description: java類作用描述
 * @Author: Zhiwen.Li【
 * @CreateDate: 2019/10/5 16:02
 * @UpdateUser: Zhiwen.Li
 * @UpdateDate: 2019/10/5 16:02
 * @UpdateRemark: 修改內容
 * @Version: 1.0
 */
/**
    等待喚醒案例:線程之間的通信
         創建一個顧客線程(消費者):告知老闆要的包子的種類和數量,調用wait方法,放棄cpu的執行,進入到WAITING狀態(無限等待)
         創建一個老闆線程(生產者):花了5秒做包子,做好包子之後,調用notify方法,喚醒顧客喫包子

    注意:
        顧客和老闆線程必須使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行
        同步使用的鎖對象必須保證唯一
        只有鎖對象才能調用wait和notify方法

    Obejct類中的方法
    void wait()
          在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。
    void notify()
          喚醒在此對象監視器上等待的單個線程。
          會繼續執行wait方法之後的代碼
 */
public class WaitAndNotify {
    public static void main(String[] args) {
        // 創建鎖對象,保證唯一
        Object obj = new Object();

        // 創建一個顧客線程
        new Thread(){
            @Override
            public void run(){
                // 一直等着買包子
                while (true){
                    // 保證等待和喚醒只能有一個執行,需要同步技術
                    synchronized (obj){
                        System.out.println("告知老闆要的包子的種類和數量");
                        // 調用wait方法,放棄cpu的執行,進入到WAITING狀態(無限等待)
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // 被喚醒後的代碼
                        System.out.println("顧客取餐喫包子");
                        System.out.println("-----------------------------------");
                    }
                }

            }
        }.start();

        // 創建一個老闆線程(生產者)
        new Thread(){
            @Override
            public void run(){
                // 一直做包子
                while (true){
                    // 5秒做包子
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 保證等待和喚醒的線程只能有一個執行,需要使用同步技術
                    synchronized (obj){
                        System.out.println("老闆5秒鐘之後做好包子,告知顧客可以喫包子了");
                        // 做好包子之後,調用notify方法,喚醒顧客喫包子
                        obj.notify();
                    }
                }

            }
        }.start();
    }

}

結果顯示:

在這裏插入圖片描述
在這裏插入圖片描述
Object類中wait帶參方法和notify

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章