1. 程式人生 > >《Java多執行緒程式設計實戰》——第七章Producer-Consumer(生產者/消費者)模式

《Java多執行緒程式設計實戰》——第七章Producer-Consumer(生產者/消費者)模式

Producer-Consumer模式的核心是通過通道對資料(或任務)的生產者和消費者進行解耦,從而使二者的處理速率相對來說互不影響。

類圖

BlockingQueueChannel:

  • 當佇列滿時,將當前執行緒掛起直到佇列非滿
  • 當佇列為空時,將當前執行緒掛起直到佇列非空

通道積壓的常見解決方法:

  • 使用有界阻塞佇列
  • 使用帶流量控制的無界阻塞佇列

工作竊取演算法:
一個通道可以對應一個或者多個佇列例項。當一個消費者執行緒處理完該執行緒對應的佇列中的“產品”時,可以繼續從其他消費者執行緒對應的佇列中取出“產品”進行處理。
執行緒的停止:
當某個服務的所有Producer參與者的工作者執行緒都停止之後,再停止該服務涉及的Consumer參與者的工作者執行緒。
停止Consumer參與者的工作者執行緒前是否考慮要等待其處理完所有待處理的“產品”或者將這些“產品”做個備份也是個問題。