淺談生產者/消費者模型

最近看了一些源碼(jdk的concurrent包),看了一本書(《大型網站技術架構》),從中發現了一個非常有用的模型:生產者/消費者模型。模型如下圖:


線程池:
在concurrent包中,比較典型的就是線程池了,線程池的作用就是複用線程,通過限制線程的創建,來降低創建線程鎖產生的開銷。在JDK中,提供了便利且好用的創建線程池的類來供調用,你可以自定義調用ThreadPoolExecutor來創建:
public ThreadPoolExecutor(int corePoolSize, //線程池的大小,不調用預創建線程函數的話,剛開始線程池裏線程數爲0
int maximumPoolSize,//線程池可容大小
long keepAliveTime, //如果線程數大於corePoolSize則任務空閒時間超過keepAliveTime會讓線程中斷,來接收新的任務
TimeUnit unit, //時間的單位,時、分、秒等
BlockingQueue<Runnable> workQueue, //阻塞隊列,當任務數超過corePoolSize時,進入阻塞隊列等待
ThreadFactory threadFactory, //創建新線程的工廠類
RejectedExecutionHandler handler); //當執行阻塞時候用的
或者直接調用,給封裝好的四種線程池:
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() {//
@Override
public Thread newThread(Runnable r) {
return null;
}
});
ExecutorService executorService = Executors.newSingleThreadExecutor(threadFactory); //只有一個線程的線程池,可以用來共享變量
ExecutorService executorService = Executors.newFixedThreadPool(coreThreadPool,threadFactory); //固定長度的線程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(coreThreadPool,threadFactory);//可用來定時操作的線程池
其實,線程池就是一個典型的生產消費者模型,最開始的時候,線程池爲空,也就是可用線程最多,任務作爲消費者可以隨便使用,當線程池滿了之後,也就是可用線程爲0,則將任務加入到阻塞隊列,當正在使用的消費者停止使用,釋放線程後,線程池重新回到可用狀態,也就是說,可以把消費者的釋放過程堪稱是線程的生產過程。
消息隊列:
在大型網站架構中,消息隊列必不可少,而且當前項目也準備增加消息隊列,就想說一下對它的理解。
消息隊列,在大型網站架構中也相當於一個生產消費者模型的存在,當客戶端發送(生產)請求,放入消息隊列中,然後服務端從消息隊列中獲取請求,處理(消費)請求,消息隊列也相當於一個緩衝區的存在,作爲一箇中間件來服務兩頭,當然,主要作用還是爲了解決併發。
另外,消息隊列還能起到解耦的作用,將前端請求和後端服務分離,將各模塊和服務分離,從而達到解耦的效果。
還有,生產消費者模型還能解決忙閒不均的問題,也就是做緩衝。
哎,混亂的思路,混亂的文章,而我只是想做一下記錄而已。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章