代碼:
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