1. 程式人生 > 其它 >生產者和消費者模式概述(等待和喚醒機制)

生產者和消費者模式概述(等待和喚醒機制)

生產者和消費者模式概述

 等待和喚醒方法

  Object類的等待和喚醒方法:

      void wait():導致當前執行緒等待,直到另一個執行緒呼叫該物件的notify()方法或notifyAll()方法

      void notify():喚醒等待物件監視器的單個執行緒

      void notifyAll():喚醒等大物件監視器的所有執行緒

  套路:

    1.while(true)死迴圈

    2.synchronized 鎖,鎖物件要唯一

    3.判斷:共享資料是否結束,結束--》跳出迴圈

    4.判斷:共享資料是否結束,未結束--》執行題目邏輯

package com.itheima.threaddemo14;

public class Desk {
    //定義一個標記
    //true--》有漢堡,允許吃貨執行
    //false--》沒有漢堡,允許廚師執行
    public static boolean flag = false;

    //漢堡的總數量
    public static int count=10;

    //鎖物件
    public static final Object lock = new Object();
}

  

package com.itheima.threaddemo14;

public class Cooker extends Thread{
    @Override
    public void run() {
        /*生產者步驟:
            1.判斷桌子上是否有漢堡
                有--》等待
                沒有--》生產
            2.把漢堡放在桌子上
            3.叫醒等待的消費者開吃
         */
        while (true){
            synchronized (Desk.lock){
                if (Desk.count==0){
                    break;
                }
                if (Desk.flag){
                    //桌子上有漢堡--》等待
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else {
                    //桌子上沒有漢堡--》生產漢堡
                    System.out.println("廚師正在製作漢堡");
                    Desk.flag=true;
                    Desk.lock.notifyAll();
                }
            }
        }
    }
}

  

package com.itheima.threaddemo14;

public class Foodie extends Thread{
    @Override
    public void run() {
        /*消費者步驟:
            1.判斷桌子上是否有漢堡
            2.沒有--》等待
            3.有--》開吃
                吃完以後,桌子上沒有漢堡--》叫醒等待執行緒的生產者繼續生產
                漢堡總數量-1
         */
        while(true){
            synchronized (Desk.lock){
                if (Desk.count==0){
                    break;
                }
                if (Desk.flag){
                    //有--吃
                    Desk.count--;
                    System.out.println("吃貨在吃漢堡");
                    Desk.flag=false;
                    Desk.lock.notifyAll();
                }else {
                    //沒有--等待
                    //使用什麼物件當作鎖,就必須用這個物件呼叫等待喚醒方法
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

  

package com.itheima.threaddemo14;

public class Demo {
    public static void main(String[] args) {
        /*消費者步驟:
            1.判斷桌子上是否有漢堡
            2.沒有--》等待
            3.有--》開吃
            4.吃完以後,桌子上沒有漢堡--》叫醒等待執行緒的生產者繼續生產
            漢堡總數量-1
         */
        /*生產者步驟:
            1.判斷桌子上是否有漢堡
                有--》等待
                沒有--》生產
            2.把漢堡放在桌子上
            3.叫醒等待的消費者開吃
         */
        Cooker cooker = new Cooker();
        Foodie foodie = new Foodie();

        cooker.start();
        foodie.start();
    }
}