在多執行緒開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為了解決這個問題於是引入了生產者和消費者模式
生產者與消費者模式是通過乙個容器來解決生產者與消費者的強耦合關係,生產者與消費者之間不直接進行通訊,而是利用阻塞佇列來進行通訊,生產者生成資料後直接丟給阻塞佇列,消費者需要資料則從阻塞佇列獲取,實際應用中,生產者與消費者模式則主要解決生產者與消費者生產與消費的速率不一致的問題,達到平衡生產者與消費者的處理能力,而阻塞佇列則相當於緩衝區。
具體實現:消費者生產蘋果放到籃子裡,消費者從籃子裡取出蘋果
籃子類相當於緩衝區:
public
class
basket
} catch
(interruptedexception e)
}synchronized (this
) }
public
void
get()
} catch
(interruptedexception e)
}synchronized (this
) }
}
蘋果類:
publicclass
private
string name;
public
void
setname(string name)
public
string getname()
}
生產者執行緒:
publicclass producer extends
thread
@override
public
void
run()
}}
消費者執行緒:
publicclass consumer extends
thread
@override
public
void
run()
}}
測試類:
publicclass
test
}
執行效果為:
生產者開始生產蘋果 1當前蘋果個數為:1
生產者開始生產蘋果 2當前蘋果個數為:2
生產者開始生產蘋果 3當前蘋果個數為:3
生產者開始生產蘋果 4當前蘋果個數為:4
生產者開始生產蘋果 5當前蘋果個數為:5
生產者開始生產蘋果 6當前蘋果個數為:6
生產者開始生產蘋果 7當前蘋果個數為:7
生產者開始生產蘋果 8當前蘋果個數為:8
生產者開始生產蘋果 9當前蘋果個數為:9
生產者開始生產蘋果 10當前蘋果個數為:10
消費者取出蘋果10當前剩餘9個蘋果
消費者取出蘋果9當前剩餘8個蘋果
消費者取出蘋果8當前剩餘7個蘋果
消費者取出蘋果7當前剩餘6個蘋果
生產者開始生產蘋果 11當前蘋果個數為:7
消費者取出蘋果11當前剩餘6個蘋果
消費者取出蘋果6當前剩餘5個蘋果
消費者取出蘋果5當前剩餘4個蘋果
消費者取出蘋果4當前剩餘3個蘋果
消費者取出蘋果3當前剩餘2個蘋果
消費者取出蘋果2當前剩餘1個蘋果
消費者取出蘋果1當前剩餘0個蘋果
生產者開始生產蘋果 12當前蘋果個數為:1
生產者開始生產蘋果 13當前蘋果個數為:2
生產者開始生產蘋果 14當前蘋果個數為:3
生產者開始生產蘋果 15當前蘋果個數為:4
生產者開始生產蘋果 16當前蘋果個數為:5
生產者開始生產蘋果 17當前蘋果個數為:6
生產者開始生產蘋果 18當前蘋果個數為:7
生產者開始生產蘋果 19當前蘋果個數為:8
生產者開始生產蘋果 20當前蘋果個數為:9
消費者取出蘋果20當前剩餘8個蘋果
消費者取出蘋果19當前剩餘7個蘋果
消費者取出蘋果18當前剩餘6個蘋果
消費者取出蘋果17當前剩餘5個蘋果
消費者取出蘋果16當前剩餘4個蘋果
消費者取出蘋果15當前剩餘3個蘋果
消費者取出蘋果14當前剩餘2個蘋果
消費者取出蘋果13當前剩餘1個蘋果
消費者取出蘋果12當前剩餘0個蘋果
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者與消費者
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 消費者函...