小案例(消費之和生產者包子關係)
/*
* 等待喚醒案例:執行緒之間的通訊
* 建立乙個顧客執行緒(消費者):告知老闆要的包子種類和數量,呼叫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 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將...