九、生產者與消費者模式
阿新 • • 發佈:2020-07-12
# 生產者消費者模式
- 生產者消費者模式是程式設計中非常常見的一種設計模式,被廣泛運用在解耦、訊息佇列等場景。
-
- 使用生產者消費者模式通常需要在兩者之間增加一個阻塞佇列作為媒介,有了媒介之後就相當於有了一個緩衝,平衡了兩者的能力。
- 整體如上圖所示,最上面是阻塞佇列,右側的 1 是生產者執行緒,生產者在生產資料後將資料存放在阻塞佇列中,左側的 2 是消費者執行緒,消費者獲取阻塞佇列中的資料。
- 而中間的 3 和 4 分別代表生產者消費者之間互相通訊的過程,因為無論阻塞佇列是滿還是空都可能會產生阻塞,阻塞之後就需要在合適的時機去喚醒被阻塞的執行緒。
- 那麼什麼時候阻塞執行緒需要被喚醒呢?有兩種情況。
- 第一種情況是當消費者看到阻塞佇列為空時,開始進入等待,這時生產者一旦往佇列中放入資料,就會通知所有的消費者,喚醒阻塞的消費者執行緒。
- 另一種情況是如果生產者發現佇列已經滿了,也會被阻塞,而一旦消費者獲取資料之後就相當於佇列空了一個位置,這時消費者就會通知所有正在阻塞的生產者進行生產。
# 使用 BlockingQueue 實現生產者消費者模式
````java
import java.util.concurrent.ArrayBlockingQueue;
/**
* 使用阻塞佇列實現一個生產者與消費者模型
*
* @author xiandongxie
*/
public class ProducerAndConsumer {
private static ArrayBlock