等待 通知機制

2021-08-15 10:31:09 字數 2213 閱讀 6971

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 之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源 執行之...