生產者與消費者

2021-10-04 10:02:47 字數 2973 閱讀 1330

生產者-消費者模式是乙個十分經典的多執行緒併發協作的模式:

所謂生產者-消費者問題,實際上主要是包含了兩類執行緒,一種是生產者執行緒用於生產資料,另一種是消費者執行緒用於消費資料,為了解耦生產者和消費者的關係,通常會採用共享的資料區域,生產者生產資料之後直接放置在共享資料區中,並不需要關心消費者的行為;而消費者只需要從共享資料區中去獲取資料,就不再需要關心生產者的行為。

對於此模型,應該明確一下幾點:

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 消費者函...