生產者與消費者設計模式

2021-09-10 09:18:16 字數 2226 閱讀 9455

1. 前言目前的專案需要在使用者提交訂單後,將訂單放入佇列,並由專門處理訂單的執行緒對佇列中的訂單做處理,由此便引入了生產者與消費者模式。

2. 生產者與消費者模式概述

生產者與消費者模式是通過乙個容器來解決生產者與消費者的強耦合關係,生產者與消費者之間不直接進行通訊,而是利用阻塞佇列來進行通訊,生產者生成資料後直接丟給阻塞佇列,消費者需要資料則從阻塞佇列獲取,實際應用中,生產者與消費者模式則主要解決生產者與消費者生產與消費的速率不一致的問題,達到平衡生產者與消費者的處理能力,而阻塞佇列則相當於緩衝區。

這就好比去學校食堂吃飯,食堂大媽並不會等你點了餐之後才立馬去給你做,而是先把飯菜做好了放在食堂視窗等你來自己取,而這個視窗就相當於阻塞佇列,食堂大媽就是生產者,而學生就是消費者。

整個生產者與消費者模型大致如下圖所示。

當然,實際情況可能需要在消費者處理完之後又作為生產者把資料放進新的佇列由其他消費者處理。

3. 應用與實現

回歸原專案,原專案的應用場景大致為:使用者提交訂單,訂單進入引擎的阻塞佇列中,由專門的執行緒從阻塞佇列中獲取資料並處理,接下來將使用此場景模擬生產者與消費者模式的實現。

本模擬**主要包括生產者執行緒、消費者執行緒、引擎(包含阻塞佇列)、訂單類等,詳細**如下。

/**

* 生產者

*/public class producerthread implements runnable

@override

public void run() catch (interruptedexception e) }}

/** 產生訂單 */

private order produceorder()

private int number = 0;

}

/**

* 消費者

*/public class consumerthread implements runnable

@override

public void run()

}private void disposeorder(order order)

}

/**

* 引擎

*/public class engine catch (interruptedexception e)

return order;

}/**

* 新增訂單

* - 如果訂單佇列已滿將一直等待,直到佇列有可用空間或者被中斷

*/public void addorder(order order) catch (interruptedexception e) }}

/**

* 訂單

*/public class order implements serializable

public void setcommodityid(string commodityid)

public string getcommodityname()

public void setcommodityname(string commodityname)

public double getprice()

public void setprice(double price)

public integer getquantity()

public void setquantity(integer quantity)

private static final long serialversionuid = 4826685511830052034l;

}

接下便是測試類了,這裡只開了乙個執行緒,主要模擬生產者與消費者速率不一致的問題。

public class test 

}

4. 總結針對原先使用輪詢的方式處理佇列中的訂單方式,無疑生產者與消費者模式將更加節約cpu資源,這在多個消費者同時處理佇列中的資料時會體現得更加明顯。

而在實際應用中,可能會面臨更複雜的問題,選擇何種設計模式也需要更具具體情形去考慮。

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

設計模式 生產者消費者模式

常見場景 某個模組負責產生資料,這些資料由另乙個模組來負責處理。產生資料的模組,就形象地稱為生產者 而處理資料的模組,就稱為消費者。該模式還需要有乙個緩衝區處於生產者和消費者之間,作為乙個中介。生產者把資料放入緩衝區,而消費者從緩衝區取出資料 緩衝區作用 1.解耦,生產者和消費者只依賴緩衝區,而不互...

設計模式 生產者消費者模式

在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費...