生產者和消費者模式概述(等待和喚醒機制)
阿新 • • 發佈:2022-05-14
生產者和消費者模式概述
等待和喚醒方法
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(); } }