執行緒間的通訊 wait notify

2021-10-22 14:16:46 字數 3210 閱讀 8628

作用:讓當前執行緒進入等待狀態(使執行緒停止執行),同時,wait()也會讓當前執行緒釋放它所持有的鎖,直到其他執行緒呼叫此物件的 notify() 方法或 notifyall() 方法,當前執行緒被喚醒(進入「就緒態」)

注意

作用:喚醒當前物件上的等待執行緒(讓停止的執行緒繼續執行);notify()是隨機喚醒乙個執行緒,而notifyall()是喚醒所有的執行緒

注意:

作用:讓當前執行緒處於阻塞狀態,直到其他執行緒呼叫此物件的notify()方法或 notifyall() 方法, 或者超過指定的時間量,當前執行緒被喚醒。

注:wait(),notify()必須使用在synchronized同步方法或者**塊內

for

/ whie 迴圈

//滿足執行條件

執行...業務

//不推薦寫notify(),在極端情況下,可能導致所有執行緒阻塞等待

object.

notifyall()

}}

流程圖:

麵包店問題:

/**

* 麵包店

* 10個生產者,每個每次生產3個

* 20個消費者,每個每次消費1個

* 庫存最大容量為100

*/public

class

breadshop

@override

public

void

run(

)else

} thread.

sleep

(100);

//優化}}

catch

(interruptedexception e)}}

/** * 生產者

*/public

static

class

producer

implements

runnable

@override

public

void

run(

)else

} thread.

sleep

(100);

}}catch

(interruptedexception e)}}

public

static

void

main

(string[

] args)

//同時啟動10個生產者執行緒

thread[

] producers =

newthread[10

];for(

int i =

0; i <

10; i++

)for

(thread t : consumers)

for(thread t : producers)

}}

麵包店問題高階:

/**

* 麵包店

* 10個生產者,每個每次生產3個

* 20個消費者,每個每次消費1個

* 公升級需求:麵包師傅每個最多生產30次:

* 消費者不再一直消費,把生產者生產完的麵包消費完,就結束

* 隱藏資訊:麵包店每天生產麵包的最大數量:麵包店每天生產10*30*3=900個麵包

* 消費者,把900個麵包消費完結束

*/public

class

breadshop2

@override

public

void

run(

)//庫存到達下限,不能繼續消費,需要阻塞等待

if(麵包店庫存 - 每次消費的麵包數 <0)

else

} thread.

sleep

(100);

}}catch

(interruptedexception e)}}

//生產者

public

static

class

producer

implements

runnable

@override

public

void

run(

) 麵包店庫存 += 每次生產的麵包數;

生產麵包的總數 += 每次生產的麵包數;

//庫存滿足生產條件

system.out.

printf

("生產者 %s 生產了%s次, 庫存%s, 生產的數量%s\n"

, name, i+

1, 麵包店庫存, 生產麵包的總數)

;//通知breadshop.class.wait();**進入阻塞的執行緒

breadshop2.

class

.notifyall()

;//模擬消費的耗時

thread.

sleep

(200);

} thread.

sleep

(100);

}}catch

(interruptedexception e)}}

public

static

void

main

(string[

] args)

//同時啟動10個生產者執行緒

thread[

] producers =

newthread

[生產者數量]

;for

(int i =

0; i< 生產者數量; i++

)for

(thread t : consumers)

for(thread t : producers)

}}

執行緒間的通訊

執行緒間的通訊 簡單說明 執行緒間通訊 在1個程序中,執行緒往往不是孤立存在的,多個執行緒之間需要經常進行通訊 執行緒間通訊的體現 1個執行緒傳遞資料給另1個執行緒 在1個執行緒中執行完特定任務後,轉到另1個執行緒繼續執行任務 執行緒間通訊常用方法 06 nsthread04 執行緒間通訊 impo...

執行緒間的通訊

1.執行緒間的通訊 多個執行緒處理同乙個資源,但處理的動作卻不同 2.執行緒間的有效通訊 使用等待喚醒機制,實現協調通訊,讓執行緒間進行有規律的執行 3.條件 3.1 wait方法與notify方法必須由同乙個鎖物件呼叫,因為,對應的鎖物件可以通過notify喚醒使用同乙個物件呼叫的wait方法後的...

執行緒間的通訊

常用的 wait notify notifyall 在乙個執行緒裡面,喚醒其他擁有同樣的鎖的執行緒 使用wait notify notifyall 時,塊必須上鎖 author fzz public class communicate catch interruptedexception e sys...