生產者和消費者模型:
通過乙個容器來解決生產者和消費者的強耦合問題。執行緒間通訊使用的api:生產者消費者彼此之間不直接通訊,而是通過阻塞佇列來進行通訊,生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列中里取,阻塞佇列相當於乙個緩衝區,平衡了生產者和消費者的處理能力
阻塞佇列就是用來給生產者和消費者解耦的。
wait():讓當前執行緒進入等待狀態,同時,wait()也會讓當前執行緒釋放它所持有的鎖.
notify():喚醒當前物件上等待的執行緒(喚醒單個執行緒)
notifyall():喚醒所有的執行緒
這三種方法都是object類的方法;
先對物件加鎖,才能呼叫上面的三個方法(呼叫這三個方法必須是在synchronized**塊中)
wait()方法:使執行緒停止執行。
使當前執行緒進行等待。用來及那個當前執行緒置入"阻塞佇列"中,並且在wait()所在的**處停止執行,直到接到通知或被中斷為止。notify()方法:使停止的執行緒繼續執行wait()方法只能在同步方法中或同步**塊中呼叫
如果呼叫wait()時,沒有持有適當的鎖,會丟擲異常。
wait()方法執行後,當前執行緒釋放鎖,執行緒與其他執行緒競爭重新獲取鎖。
用來通知那些可能等待該物件的物件鎖的其他執行緒,對其發出notify,並使它們重新獲取該物件的物件鎖。如果有多個執行緒等待,則由執行緒規劃器隨機挑選出乙個呈wait狀態的執行緒。notifyall():喚醒所有等待執行緒在notify()後,當前執行緒不會馬上釋放該物件鎖,要等到執行notify()方法的執行緒將程式執行完,退出同步**塊之後才會釋放物件鎖。
執行緒間通訊的過程:
消費者一直消費生產者一直生產
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...
生產者消費者模型
當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...