生產者-消費者模式是乙個十分經典的多執行緒併發協作的模式:
所謂生產者-消費者問題,實際上主要是包含了兩類執行緒,一種是生產者執行緒用於生產資料,另一種是消費者執行緒用於消費資料,為了解耦生產者和消費者的關係,通常會採用共享的資料區域,生產者生產資料之後直接放置在共享資料區中,並不需要關心消費者的行為;而消費者只需要從共享資料區中去獲取資料,就不再需要關心生產者的行為。
對於此模型,應該明確一下幾點:
1、生產者僅僅在倉儲未滿時候生產,倉滿則停止生產。
2、消費者僅僅在倉儲有產品時候才能消費,倉空則等待。
3、當消費者發現倉儲沒產品可消費時候會通知生產者生產。
4、生產者在生產出可消費產品時候,應該通知等待的消費者去消費。
案例1使用lock鎖和condition控制(傳統版)
public
class
myresource
// **走到這說明num = 0 ,可以進行生產
num++
; system.out.
println
(thread.
currentthread()
.getname()
+"執行緒生產成功,num="
+ num)
;// 喚醒消費者執行緒可以進行消費
condition.
signalall()
;}catch
(interruptedexception e)
finally
}// 消費者
public
void
consumer()
// **走到這說明可以消費
num--
; system.out.
println
(thread.
currentthread()
.getname()
+"執行緒消費成功:num="
+ num)
;// 喚醒生產線程,可以繼續生產
condition.
signalall()
;}catch
(interruptedexception e)
finally
}public
static
void
main
(string[
] args)},
"t"+ i)
.start()
;}for(
int i =
6; i <=
10; i++)}
,"t"
+ i)
.start()
;}}}
執行結果:
t1執行緒生產成功,num=
1t6執行緒消費成功:num=
0t2執行緒生產成功,num=
1t8執行緒消費成功:num=
0t4執行緒生產成功,num=
1t7執行緒消費成功:num=
0t3執行緒生產成功,num=
1t9執行緒消費成功:num=
0t5執行緒生產成功,num=
1t10執行緒消費成功:num=
0
從結果可以得知,生產乙個,消費乙個
案例2使用阻塞佇列,不加鎖的生產者與消費者
/**
* 生產者與消費者
*/public
class
myresource02
// 生產者
public
void
producer()
catch
(interruptedexception e)
int data = atomicinteger.
incrementandget()
;;boolean b = blockingqueue.
offer
(data +"")
;// 如果b為fals,表示佇列已滿,沒有往佇列新增成功if(
!b) system.out.
println
(thread.
currentthread()
.getname()
+"執行緒生產資料:"
+data);}
// producerflag = false,表示不需要生產了
system.out.
println
("生產停止,不需要生產");
}// 消費者
public
void
consumer()
system.out.
println
(thread.
currentthread()
.getname()
+" 消費資料: "
+ data);}
// 如果flag = false,表示不需要生產了
system.out.
println
("生產停止,不需要生產");
}public
void
setproducerflag
(boolean flag)
public
void
setconsumerflag
(boolean flag)
public
static
void
main
(string[
] args)},
"t"+ i)
.start()
;}// 定義3個執行緒進行消費
for(
int i =
4; i <=
6; i++)}
,"t"
+ i)
.start()
;}}}
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者與消費者
include include include include include include define size of buffer 10 int buffer size of buffer 緩衝陣列 int in 0,out 0 採用迴圈佇列方式進行陣列的訪問 宣告訊號量 sem t ful...
生產者與消費者
include include include include include include handle mutex 互斥訊號量 handle full 滿緩衝區訊號量計數 handle empty 空緩衝區訊號量計數 void producer 生產者函式 void consumer 消費者函...