摘要:一定義就是生產者消費者模式。消費者參與者從參與者獲取數據,進行處理。通道參與者從參與者處接受參與者,并保管起來,并應參與者的要求,將參與者傳送出去。為確保安全性,參與者與參與者要對訪問共享互斥。
一、定義
Producer-Consumer Pattern就是生產者-消費者模式。
生產者和消費者在為不同的處理線程,生產者必須將數據安全地交給消費者,消費者進行消費時,如果生產者還沒有建立數據,則消費者需要等待。
一般來說,可能存在多個生產者和消費者,不過也有可能生產者和消費者都只有一個,當雙方都只有一個時,我們也稱之為Pipe Pattern。
該案例中,定義了3個角色:廚師、客人、桌子。
廚師(生產者)定義:
public class MakerThread extends Thread { private final Random random; private final Table table; private static int id = 0; //蛋糕的流水號(所有廚師共通) public MakerThread(String name, Table table, long seed) { super(name); this.table = table; this.random = new Random(seed); } public void run() { try { while (true) { Thread.sleep(random.nextInt(1000)); String cake = "[ Cake No." + nextId() + " by " + getName() + " ]"; table.put(cake); } } catch (InterruptedException e) { } } private static synchronized int nextId() { return id++; } }
客人(消費者)定義:
public class EaterThread extends Thread { private final Random random; private final Table table; public EaterThread(String name, Table table, long seed) { super(name); this.table = table; this.random = new Random(seed); } public void run() { try { while (true) { String cake = table.take(); Thread.sleep(random.nextInt(1000)); } } catch (InterruptedException e) { } } }
桌子(隊列)定義:
public class Table { private final String[] buffer; private int tail; private int head; private int count; ? public Table(int count) { this.buffer = new String[count]; this.head = 0; this.tail = 0; this.count = 0; } public synchronized void put(String cake) throws InterruptedException { System.out.println(Thread.currentThread().getName() + " puts " + cake); while (count >= buffer.length) { wait(); } buffer[tail] = cake; tail = (tail + 1) % buffer.length; count++; notifyAll(); } public synchronized String take() throws InterruptedException { while (count <= 0) { wait(); } String cake = buffer[head]; head = (head + 1) % buffer.length; count--; notifyAll(); System.out.println(Thread.currentThread().getName() + " takes " + cake); return cake; } }
執行:
public class Main { public static void main(String[] args) { Table table = new Table(3); new MakerThread("MakerThread-1", table, 31415).start(); new MakerThread("MakerThread-2", table, 92653).start(); new MakerThread("MakerThread-3", table, 58979).start(); new EaterThread("EaterThread-1", table, 32384).start(); new EaterThread("EaterThread-2", table, 62643).start(); new EaterThread("EaterThread-3", table, 38327).start(); } }三、模式講解
Producer-Consumer模式的角色如下:
Data(數據)參與者
Data代表了實際生產或消費的數據。
Producer(生產者)參與者
Producer會創建Data,然后傳遞給Channel參與者。
Consumer(消費者)參與者
Consumer從Channel參與者獲取Data數據,進行處理。
Channel(通道)參與者
Channel從Producer參與者處接受Data參與者,并保管起來,并應Consumer參與者的要求,將Data參與者傳送出去。為確保安全性,Producer參與者與Consumer參與者要對訪問共享互斥。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71514.html
摘要:和方法會一直阻塞調用線程,直到線程被中斷或隊列狀態可用和方法會限時阻塞調用線程,直到超時或線程被中斷或隊列狀態可用。 showImg(https://segmentfault.com/img/bVbgyPy?w=1191&h=670); 本文首發于一世流云專欄:https://segmentfault.com/blog... 一、引言 從本節開始,我們將介紹juc-collectio...
摘要:個巡個推系統監控隨著個推業務的不斷擴展,用戶量不斷的增加,個推急需一套完整的監控系統來實時保證系統和業務的正常運轉。系統難點與設計多元化的數據基于推送業務,個推擴展出許多獨立運行的系統,而且每個系統的監控數據也不一樣。 什么是系統監控對于功能簡單,用戶量較少的軟件系統,大部分公司不需要額外的監控系統來保證公司業務的正常運行。而當公司發展到一定程度,系統越來越多元化,單一系統也越來越復雜...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執著追求科學夢想的精神,將激勵一代又一代科技工作者繼續奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎知識點進行...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執著追求科學夢想的精神,將激勵一代又一代科技工作者繼續奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎知識點進行...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
閱讀 1075·2021-09-29 09:35
閱讀 4621·2021-09-22 15:24
閱讀 1449·2021-07-25 21:37
閱讀 2178·2019-08-30 14:17
閱讀 965·2019-08-30 13:56
閱讀 2411·2019-08-29 17:07
閱讀 1251·2019-08-29 12:44
閱讀 2705·2019-08-26 18:26