亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

生產消費者模式實現方式和線程安全問題代碼示例

2024-07-13 10:15:40
字體:
來源:轉載
供稿:網友

生產者消費者模式的幾種實現方式

拿我們生活中的例子來說,工廠生產出來的產品總是要輸出到外面使用的,這就是生產與消費的概念。

在我們實際的軟件開發過程中,經常會碰到如下場景:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。

產生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。

第一種:采用wait—notify實現生產者消費者模式

1. 一生產者與一消費者:

2. 一生產者與多消費者:

第二種: 采用阻塞隊列實現生產者消費者模式

3. 使用阻塞隊列實現生產者消費者模式

相信大家都有去吃過日本料理。有個很誘人的餐食就是烤肉,烤肉師父會站在一邊一直烤肉,再將烤好的肉放在一個盤子中;而流著口水的我們這些食客會坐在一邊,只要盤子里有肉我們就會一直去吃。

在這個生活案例中,烤肉師父就是生產者,他就負責烤肉,烤完了就把肉放在盤子里,而不是直接遞給食客(即不用通知食客去吃肉),如果盤子肉滿,師父就會停一會,直到有人去食用烤肉后再去進行生產肉;而食客的我們就只是盯著盤子,一旦盤子有肉我們就負責去吃就行;

整個過程中食客與烤肉師父都不是直接打交道的,而是都與盤子進行交互。

盤子充當了一個緩沖區的概念,有東西生產出來就把東西放進去,盤子也是有大小限制,超過盤子大小就會阻塞生產者生產,等待消費者去消費;當盤子為空的時候 ,即阻塞消費者消費,等待生產者去生產。

編程中阻塞隊列即可以實現盤子這個功能。

阻塞隊列的特點:

當隊列元素已滿的時候,阻塞插入操作;

當隊列元素為空的時候,阻塞獲取操作。

ArrayBlockingQueue 與 LinkedBlockingQueue都是支持FIFO(先進先出),但是LinkedBlockingQueue是無界的,而ArrayBlockingQueue 是有界的。

下面使用阻塞隊列實現生產者消費者:

生產者:

import java.util.concurrent.BlockingQueue;public class Producer implements Runnable{	private final BlockingQueue blockingQueue;	//設置隊列緩存的大小。生產過程中超過這個大小就暫時停止生產	private final int QUEUE_SIZE = 10;	public Producer(BlockingQueue blockingQueue){		this.blockingQueue = blockingQueue;	}	int task = 1;	@Override	  public void run() {		while(true){			try {				System.out.println("正在生產:" + task);				//將生產出來的產品放在隊列緩存中				blockingQueue.put(task);				++task;				//讓其停止一會,便于查看效果				Thread.sleep(1000);			}			catch (InterruptedException e) {				e.printStackTrace();			}		}	}}

消費者:

import java.util.concurrent.BlockingQueue;//消費者public class Consumer implements Runnable{	private final BlockingQueue blockingQueue;	public Consumer(BlockingQueue blockingQueue){		this.blockingQueue = blockingQueue;	}	@Override	  public void run() {		//只要阻塞隊列中有任務,就一直去消費		while(true){			try {				System.out.println("正在消費: " + blockingQueue.take());				//讓其停止一會,便于查看效果				Thread.sleep(2000);			}			catch (InterruptedException e) {				e.printStackTrace();			}		}	}}

測試:

import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;/** * 生產者消費者模式 * 使用阻塞隊列BlockingQueue * @author wanggenshen * */public class TestConPro {	public static void main(String[] args){		BlockingQueue blockingQueue = new LinkedBlockingQueue(5);		Producer p = new Producer(blockingQueue);		Consumer c = new Consumer(blockingQueue);		Thread tp = new Thread(p);		Thread tc= new Thread(c);		tp.start();		tc.start();	}}

因為LinkedBlockingQueue是無界隊列,所以生產者會不斷去生產,將生產出的任務放在隊列中,消費者去隊列中去消費:

生產者消費者模式代碼,線程安全代碼,線程安全的代碼

如果改用有界阻塞隊列ArrayBlockingQueue,就可以初始化隊列的大小。則隊列中元素超過隊列大小的時候,生產者就會等待消費者消費一個再去生產一個:

測試代碼:

初始化一個大小為10的ArrayBlockingQueue:

public static void main(String[] args){	BlockingQueue blockingQueue = new ArrayBlockingQueue(10);	Producer p = new Producer(blockingQueue);	Consumer c = new Consumer(blockingQueue);	Thread tp = new Thread(p);	Thread tc= new Thread(c);	tp.start();	tc.start();}

測試中,讓生產者生產速度略快,而消費者速度略慢一點。可以看到生產出來的產品序號與消費的產品序號差始終為10(隊列的大小):

生產者消費者模式代碼,線程安全代碼,線程安全的代碼

總結

以上就是本文關于生產消費者模式實現方式和線程安全問題代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美在线成人app| 91精品久久久久久久久久另类| 日韩免费在线看| 亚洲成色777777在线观看影院| yellow中文字幕久久| 亚洲日本aⅴ片在线观看香蕉| 国产精品日韩电影| 欧美激情亚洲国产| 久久免费视频在线观看| 另类天堂视频在线观看| 永久免费精品影视网站| 亚洲精品欧美日韩专区| 中文字幕精品一区久久久久| 中文字幕久热精品在线视频| 国产精品久久久av| 中文字幕日韩在线视频| 国产一区二区三区18| 亚洲国产又黄又爽女人高潮的| 国产精品视频久久久| 亚洲欧美激情另类校园| 在线观看视频亚洲| 精品成人在线视频| 97久久精品在线| 亚洲精品色婷婷福利天堂| 超碰精品一区二区三区乱码| 欧美激情一区二区三区成人| 欧美最顶级丰满的aⅴ艳星| 久久视频在线观看免费| 日韩精品一区二区视频| 亚洲精品国产综合久久| 久久精品视频免费播放| 国产精品一区二区三区久久久| 影音先锋欧美在线资源| 欧美精品在线看| 国产伦精品免费视频| 成人精品一区二区三区电影免费| 欧美另类交人妖| 中文字幕欧美精品日韩中文字幕| 色婷婷亚洲mv天堂mv在影片| 色噜噜狠狠狠综合曰曰曰| 欧美精品少妇videofree| 午夜精品美女自拍福到在线| 久久久久久久一区二区| 在线观看欧美视频| 国产成人精品亚洲精品| 亚洲大胆美女视频| 日韩免费观看高清| 国产精品免费一区二区三区都可以| 国产欧美一区二区白浆黑人| 国产成人极品视频| 国产精品美女无圣光视频| 欧美性感美女h网站在线观看免费| 国产精品视频专区| 亚洲精品综合精品自拍| 精品国产一区二区三区久久久狼| 日韩欧美中文字幕在线播放| 日韩视频精品在线| 91丝袜美腿美女视频网站| 最近2019中文字幕在线高清| 精品香蕉在线观看视频一| 91中文精品字幕在线视频| 日本高清不卡的在线| 欧洲精品毛片网站| 性夜试看影院91社区| 欧美极品少妇xxxxⅹ裸体艺术| 精品女厕一区二区三区| 久久99亚洲热视| 日韩中文字幕免费看| 超碰日本道色综合久久综合| 日韩在线视频线视频免费网站| 日韩视频免费在线观看| 国产精品电影久久久久电影网| 久久99精品久久久久久噜噜| 久久国产精品电影| 色狠狠久久aa北条麻妃| 久久国产精品电影| 亚洲电影免费观看高清完整版在线观看| 国产成人精品午夜| 久久久久久久影视| 国产91精品视频在线观看| 国产精品久久999| 国产精品伦子伦免费视频| 亚洲视频精品在线| 久久久在线免费观看| 亚洲色图综合久久| 欧美一级淫片videoshd| 亚洲国产成人av在线| 久久资源免费视频| 色爱精品视频一区| 欧美黑人又粗大| 欧美视频一二三| 国产精品久久久久av免费| 亚洲国产一区二区三区四区| 国产91精品最新在线播放| 久久这里只有精品99| 日韩在线观看电影| 精品视频偷偷看在线观看| 色诱女教师一区二区三区| 成人乱人伦精品视频在线观看| 中文字幕亚洲图片| 中文字幕不卡在线视频极品| 亚洲精品一区av在线播放| 国产精品永久在线| 日韩av网站导航| 中文精品99久久国产香蕉| 国产成人亚洲综合91| 欧美国产在线电影| 亚洲自拍偷拍在线| 中文在线不卡视频| 超碰97人人做人人爱少妇| 国产日韩欧美日韩| 97国产suv精品一区二区62| 国产精品va在线| 久久精品男人天堂| 色悠悠久久久久| 亚洲999一在线观看www| 国产精品亚洲片夜色在线| 亚洲午夜av电影| 91九色视频导航| 国产一区二区三区网站| 主播福利视频一区| 亚洲国产精品一区二区久| 久久成人综合视频| 国产视频精品va久久久久久| 欧美一级大片在线免费观看| 在线观看中文字幕亚洲| 亚洲人成毛片在线播放| 日韩三级成人av网| 国产亚洲精品久久久久久牛牛| 国产精品久久久久久av福利| 亚洲香蕉av在线一区二区三区| 亚洲精品小视频在线观看| 亚洲精品美女网站| www.欧美三级电影.com| 久久久99久久精品女同性| 亚洲欧美日韩国产成人| 亚洲一区二区三区毛片| 国产精品久久久久久久久久小说| 日本人成精品视频在线| 国产精品91免费在线| 国产日韩精品在线观看| 欧美性猛交xxxx富婆弯腰| 97在线精品视频| 久久久视频在线| 亚洲第一视频网站| 亚洲视频综合网| 精品国产区一区二区三区在线观看| 国产成人精品日本亚洲专区61| 亚洲欧洲日产国码av系列天堂| 日韩精品中文字幕在线播放| 国产精品观看在线亚洲人成网| 26uuu另类亚洲欧美日本一| 国产精品久久久久久久久借妻| 国产精品久久久av久久久| 国产午夜精品一区理论片飘花| 亚洲欧美在线第一页| 欧美激情xxxxx| 伊人久久久久久久久久久| 欧美日韩中文字幕在线视频| 久久天天躁狠狠躁夜夜躁| 国产成人一区三区| 国产91精品久久久久久久| 亚洲国产古装精品网站| 国产日本欧美一区|