生產者消費者模型

2021-10-22 14:29:07 字數 3419 閱讀 2260

生產者和消費者模型:

通過乙個容器來解決生產者和消費者的強耦合問題。

生產者消費者彼此之間不直接通訊,而是通過阻塞佇列來進行通訊,生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列中里取,阻塞佇列相當於乙個緩衝區,平衡了生產者和消費者的處理能力

阻塞佇列就是用來給生產者和消費者解耦的。

執行緒間通訊使用的api:

wait():讓當前執行緒進入等待狀態,同時,wait()也會讓當前執行緒釋放它所持有的鎖.

notify():喚醒當前物件上等待的執行緒(喚醒單個執行緒)

notifyall():喚醒所有的執行緒

這三種方法都是object類的方法;

先對物件加鎖,才能呼叫上面的三個方法(呼叫這三個方法必須是在synchronized**塊中)

wait()方法:使執行緒停止執行。

使當前執行緒進行等待。用來及那個當前執行緒置入"阻塞佇列"中,並且在wait()所在的**處停止執行,直到接到通知或被中斷為止。

wait()方法只能在同步方法中或同步**塊中呼叫

如果呼叫wait()時,沒有持有適當的鎖,會丟擲異常。

wait()方法執行後,當前執行緒釋放鎖,執行緒與其他執行緒競爭重新獲取鎖。

notify()方法:使停止的執行緒繼續執行

用來通知那些可能等待該物件的物件鎖的其他執行緒,對其發出notify,並使它們重新獲取該物件的物件鎖。如果有多個執行緒等待,則由執行緒規劃器隨機挑選出乙個呈wait狀態的執行緒。

在notify()後,當前執行緒不會馬上釋放該物件鎖,要等到執行notify()方法的執行緒將程式執行完,退出同步**塊之後才會釋放物件鎖。

notifyall():喚醒所有等待執行緒

執行緒間通訊的過程:

消費者一直消費

生產者一直生產

20個消費者執行緒,消費者每次消費乙個

10個生產者執行緒,生產者每次生產三個

最大庫存為100

public

class

breadshop1

@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)

for(thread thread : consumer)

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

thread[

] producers =

newthread[10

];for(

int i =

0;i<

10;i++

)for

(thread thread : producers)

}}

改變需求:

10個消費者,每次消費的數量為5

5個生產者,每天的生產次數是10,每次生產的個數是3

最大庫存量為100

public

class

breadshop高階版

@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();**進入阻塞的執行緒

breadshop高階版.

class

.notifyall()

;//模擬消費的耗時

thread.

sleep

(200);

} thread.

sleep

(100);

}}catch

(interruptedexception e)}}

public

static

void

main

(string[

] args)

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

thread[

] producers =

newthread

[生產者數量]

;for

(int i =

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

)for

(thread t : consumers)

for(thread t : producers)

}}

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...

生產者消費者模型

當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...