摘要:一定義就是生產(chǎn)者消費者模式。消費者參與者從參與者獲取數(shù)據(jù),進行處理。通道參與者從參與者處接受參與者,并保管起來,并應(yīng)參與者的要求,將參與者傳送出去。為確保安全性,參與者與參與者要對訪問共享互斥。
一、定義
Producer-Consumer Pattern就是生產(chǎn)者-消費者模式。
生產(chǎn)者和消費者在為不同的處理線程,生產(chǎn)者必須將數(shù)據(jù)安全地交給消費者,消費者進行消費時,如果生產(chǎn)者還沒有建立數(shù)據(jù),則消費者需要等待。
一般來說,可能存在多個生產(chǎn)者和消費者,不過也有可能生產(chǎn)者和消費者都只有一個,當雙方都只有一個時,我們也稱之為Pipe Pattern。
該案例中,定義了3個角色:廚師、客人、桌子。
廚師(生產(chǎn)者)定義:
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; } }
執(zhí)行:
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(數(shù)據(jù))參與者
Data代表了實際生產(chǎn)或消費的數(shù)據(jù)。
Producer(生產(chǎn)者)參與者
Producer會創(chuàng)建Data,然后傳遞給Channel參與者。
Consumer(消費者)參與者
Consumer從Channel參與者獲取Data數(shù)據(jù),進行處理。
Channel(通道)參與者
Channel從Producer參與者處接受Data參與者,并保管起來,并應(yīng)Consumer參與者的要求,將Data參與者傳送出去。為確保安全性,Producer參與者與Consumer參與者要對訪問共享互斥。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71514.html
摘要:和方法會一直阻塞調(diào)用線程,直到線程被中斷或隊列狀態(tài)可用和方法會限時阻塞調(diào)用線程,直到超時或線程被中斷或隊列狀態(tài)可用。 showImg(https://segmentfault.com/img/bVbgyPy?w=1191&h=670); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... 一、引言 從本節(jié)開始,我們將介紹juc-collectio...
摘要:個巡個推系統(tǒng)監(jiān)控隨著個推業(yè)務(wù)的不斷擴展,用戶量不斷的增加,個推急需一套完整的監(jiān)控系統(tǒng)來實時保證系統(tǒng)和業(yè)務(wù)的正常運轉(zhuǎn)。系統(tǒng)難點與設(shè)計多元化的數(shù)據(jù)基于推送業(yè)務(wù),個推擴展出許多獨立運行的系統(tǒng),而且每個系統(tǒng)的監(jiān)控數(shù)據(jù)也不一樣。 什么是系統(tǒng)監(jiān)控對于功能簡單,用戶量較少的軟件系統(tǒng),大部分公司不需要額外的監(jiān)控系統(tǒng)來保證公司業(yè)務(wù)的正常運行。而當公司發(fā)展到一定程度,系統(tǒng)越來越多元化,單一系統(tǒng)也越來越復(fù)雜...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎(chǔ)課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎(chǔ)知識點進行...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎(chǔ)課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎(chǔ)知識點進行...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
閱讀 1084·2021-09-29 09:35
閱讀 4665·2021-09-22 15:24
閱讀 1461·2021-07-25 21:37
閱讀 2192·2019-08-30 14:17
閱讀 976·2019-08-30 13:56
閱讀 2420·2019-08-29 17:07
閱讀 1280·2019-08-29 12:44
閱讀 2714·2019-08-26 18:26