14 等待喚醒機制 乙個吃貨和包子鋪之間的案例

2021-10-18 10:30:49 字數 3241 閱讀 9371

小案例(消費之和生產者包子關係)

/*

* 等待喚醒案例:執行緒之間的通訊

* 建立乙個顧客執行緒(消費者):告知老闆要的包子種類和數量,呼叫wait方法,放棄cpu執行,進入到waiting狀態(無限等待)

* 建立乙個老闆執行緒(生產者):花了5秒做包子,做好了之後,呼叫notify方法,喚醒顧客吃包子

* * 注意:

* 1.顧客和老闆執行緒必須使用同步**塊包裹起來,保證等待和喚醒只有乙個在執行

* 2.同步使用的鎖物件那個必須保證唯一

* 3.只有鎖物件才能呼叫wait和notify方法

* * obejct類中的方法

void wait()

在其他執行緒呼叫此物件的 notify() 方法或 notifyall() 方法前,導致當前執行緒等待。

void notify()

喚醒在此物件監視器上等待的單個執行緒。

會繼續執行wait方法之後的**

* */

public class test10 catch (interruptedexception e)

//喚醒之後執行

system.out.println("老闆包子已經生產好了,開吃");

system.out.println("--------------------");}}

}}.start();

//建立乙個老闆的執行緒

new thread() catch (interruptedexception e)

system.out.println("花費了5秒後包子生產完成了");

//喚醒消費者,包子好了,可以開吃了

obj.notify();}}

}}.start();

}}

/*

* 進入到timewaiting(計時等待)有兩種方式

* 1.使用sleep(long m)方法,在毫秒值結束之後,執行緒睡醒進入到runnable/blocked狀態

* 2.使用wait(long m)方法,wait方法如果在毫秒值結束之後,還沒有被notify喚醒,就會自動喚醒,執行緒睡醒進入到runnable/blocked狀態

* * 喚醒的方法:

* void notify() 喚醒在此物件監視器上等待的單個執行緒。 如果有多個等待執行緒,隨機喚醒乙個

void notifyall() 喚醒在此物件監視器上等待的所有執行緒。 喚醒所有等待的執行緒

* * */

包子類

/*

資源類:包子類

設定包子的屬性

皮 陷包子的狀態: 有 true,沒有 false

*/public class baozi

包子鋪類

/*

生產者(包子鋪)類:是乙個執行緒類,可以繼承thread

設定執行緒任務(run):生產包子

對包子的狀態進行判斷

true:有包子

包子鋪呼叫wait方法進入等待狀態

false:沒有包子

包子鋪生產包子

增加一些趣味性:交替生產兩種包子

有兩種狀態(i%2==0)

包子鋪生產好了包子

修改包子的狀態為true有

喚醒吃貨執行緒,讓吃貨執行緒吃包子

注意: 包子鋪執行緒和包子執行緒關係-->通訊(互斥)

必須同時同步技術保證兩個執行緒只能有乙個在執行

鎖物件必須保證唯一,可以使用包子物件作為鎖物件

包子鋪類和吃貨的類就需要把包子物件作為引數傳遞進來

1.需要在成員位置建立乙個包子變數

2.使用帶引數構造方法,為這個包子變數賦值

*/public class baozipu extends thread

@override

public void run() catch (interruptedexception e)

}//生產者,被喚醒之後,會進行生產包子

if(count%2==0)else

count++;

system.out.println("包子鋪正在生產"+bao.pi+bao.xian+"的包子");

//生產包子需要3秒鐘

try catch (interruptedexception e)

//包子生產好了,需要改變包子的狀態為true

bao.flag=true;

//喚醒消費者,開始吃包子吧

bao.notify();

system.out.println("包子鋪已經生產好了"+bao.pi+bao.xian+"包子,吃貨可以開始吃了");

}} }

}

吃貨類

/*

消費者(吃貨)類:是乙個執行緒類,可以繼承thread

設定執行緒任務(run):吃包子

對包子的狀態進行判斷

false:沒有包子

吃貨呼叫wait方法進入等待狀態

true:有包子

吃貨吃包子

吃貨吃完包子

修改包子的狀態為false沒有

吃貨喚醒包子鋪執行緒,生產包子

*/public class chihuo extends thread

@override

public void run() catch (interruptedexception e)

}//喚醒以後,吃貨就可以開始吃包子了

system.out.println("吃貨正在吃"+bao.pi+bao.xian+"的包子");

//吃貨吃完包子以後,改變包子的狀態

bao.flag=false;

//喚醒包子鋪開始生產包子

bao.notify();

system.out.println("吃貨已經吃完了"+bao.pi+bao.xian+"的包子,包子鋪開始生產包子");

system.out.println("***********************************====");

}} }

}

測試類

public class test 

}

3 1等待 通知機制(wait notify)

要點 wait 執行前在呼叫wait 之前,必須先要獲得物件鎖,即只有在同步方法或者同步 塊中呼叫wait 方法。執行作用 wait 使程序進入等待 阻塞狀態 在收到通知或者被中斷之前都會進入預執行佇列。執行之後1 執行wait 之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源 執行之...

11 等待 通知(wait notify)機制介紹

1.當兩個執行緒主動地讀取乙個共享變數時,在花費讀取時間的基礎上,讀取到的值是不是想要的,並不能完全確定,等待 通知 機制就用來滿足這樣的需求。2.wait 的作用是使當前執行的執行緒進行等待。呼叫之前要獲取物件級別鎖,即只能在同步方法中或者同步塊中呼叫。執行wait 方法後,當前執行緒釋放鎖,在從...

執行緒間的等待喚醒機制 (一)

wait 可以是當前執行緒進行等待 notify 喚醒操作的執行緒 notifyall 喚醒所有執行緒。當前執行緒必須擁有此物件監視器。該執行緒發布對此監視器的所有權並等待,直到其他執行緒通過呼叫 notify 方法,或 notifyall 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將...