waitnotify模式的注意事項
經典案例生產者消費者模式實現
實戰等待通知之交叉備份
舉例說明,廚師和服務員之間的互動:
1. 廚師做完一道菜的時間不確定,所以廚師將菜品放到」菜品傳遞臺」上的時間也不確定;
2. 服務員取到菜的時間取決於廚師,所以服務員就處於等待狀態;
3. 服務員如何取到菜呢?又得取決於廚師,廚師將菜放在」菜品傳遞臺」上,其實就相當於一種通知,這時服務員才可以拿到菜並交給就餐者。
一句話總結:wait 使執行緒停止執行,而 notify 使停止的執行緒繼續執行。
runnable 狀態 & running 狀態
runnable:就緒狀態,隨時可能被 cpu 排程執行
running:執行狀態,執行緒獲取 cpu 許可權進行執行
建立乙個新的執行緒物件後,呼叫start()方法,系統為此執行緒分配 cpu 資源,執行緒進入runnable狀態
如果執行緒搶占到 cpu 資源,此執行緒進入running狀態
running 狀態 -> blocked 狀態
blocked:阻塞狀態,執行緒放棄了 cpu 使用權,暫時停止執行,直到執行緒進入就緒狀態。分為三種:
1.等待阻塞:呼叫wait()方法,讓執行緒等到某工作的完成
2.同步阻塞:synchronized 獲取物件鎖失敗(可能鎖被占用)
3.其他阻塞:呼叫sleep() | join() | 發出 io 請求時,執行緒進入阻塞。
blocked 狀態 -> runnable 狀態
dead 狀態
執行緒執行完了或者異常退出了 run() 方法,結束生命週期。
每個鎖物件都有兩個佇列:
- 就緒佇列:儲存將要獲得鎖的執行緒,乙個執行緒被喚醒後,進入就緒佇列,等到 cpu 排程
- 阻塞佇列:儲存被阻塞的執行緒,乙個執行緒被 wait() 後,進入阻塞佇列,等待下一次被喚醒
建立 20 個執行緒,其中 10 個執行緒是將資料備份到 a 資料中,另外 10 個執行緒是將資料備份到 b 資料庫中,並且備份 a 資料庫和 b 資料庫是交叉進行的。
public
class
dbtools
for (int i = 0; i < 5; i++)
previsa = true;
notifyall();
} catch (interruptedexception e)
}synchronized
public
void
backupb()
for (int i = 0; i < 5; i++)
previsa = false;
notifyall();
} catch (interruptedexception e)
}}
public
class
backupa
extends
thread
@override
public
void
run()
}
public
class
backupb
extends
thread
@override
public
void
run()
}
public
class
run
}}
Conditon等待 通知機制
condition的api和object的wait notify用法大致相同,但是object需要配合synchronized來使用,如果使用顯示鎖lock無法使用。因此condition應運而生,他是由lock的api建立出來的等待 通知機制 await signal 和wait notify 相...
15 執行緒等待通知機制總結
執行緒等待通知機制總結 概述 乙個執行緒的等待阻塞狀態,受另外乙個執行緒控制。object.wait object.notify 特點必須基於特定的物件鎖synchronized notify只會對已經處於wait狀態的執行緒生效。使用必須在synchronized obj 內部使用,否則會丟擲異常...
3 1等待 通知機制(wait notify)
要點 wait 執行前在呼叫wait 之前,必須先要獲得物件鎖,即只有在同步方法或者同步 塊中呼叫wait 方法。執行作用 wait 使程序進入等待 阻塞狀態 在收到通知或者被中斷之前都會進入預執行佇列。執行之後1 執行wait 之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源 執行之...