最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

生產(chǎn)消費(fèi)者模式實(shí)現(xiàn)方式和線程安全問題代碼示例

 更新時(shí)間:2017年12月29日 10:49:04   作者:nomico271  
這篇文章主要介紹了生產(chǎn)消費(fèi)者模式實(shí)現(xiàn)方式和線程安全問題代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下

生產(chǎn)者消費(fèi)者模式的幾種實(shí)現(xiàn)方式

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

在我們實(shí)際的軟件開發(fā)過程中,經(jīng)常會碰到如下場景:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。

產(chǎn)生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。

第一種:采用wait—notify實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

1. 一生產(chǎn)者與一消費(fèi)者:

2. 一生產(chǎn)者與多消費(fèi)者:

第二種: 采用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

3. 使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

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

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

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

盤子充當(dāng)了一個(gè)緩沖區(qū)的概念,有東西生產(chǎn)出來就把東西放進(jìn)去,盤子也是有大小限制,超過盤子大小就會阻塞生產(chǎn)者生產(chǎn),等待消費(fèi)者去消費(fèi);當(dāng)盤子為空的時(shí)候 ,即阻塞消費(fèi)者消費(fèi),等待生產(chǎn)者去生產(chǎn)。

編程中阻塞隊(duì)列即可以實(shí)現(xiàn)盤子這個(gè)功能。

阻塞隊(duì)列的特點(diǎn):

當(dāng)隊(duì)列元素已滿的時(shí)候,阻塞插入操作;

當(dāng)隊(duì)列元素為空的時(shí)候,阻塞獲取操作。

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

下面使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者:

生產(chǎn)者:

import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable{
	private final BlockingQueue blockingQueue;
	//設(shè)置隊(duì)列緩存的大小。生產(chǎn)過程中超過這個(gè)大小就暫時(shí)停止生產(chǎn)
	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("正在生產(chǎn):" + task);
				//將生產(chǎn)出來的產(chǎn)品放在隊(duì)列緩存中
				blockingQueue.put(task);
				++task;
				//讓其停止一會,便于查看效果
				Thread.sleep(1000);
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

消費(fèi)者:

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

測試:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
 * 生產(chǎn)者消費(fèi)者模式
 * 使用阻塞隊(duì)列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();
	}
}

因?yàn)長inkedBlockingQueue是無界隊(duì)列,所以生產(chǎn)者會不斷去生產(chǎn),將生產(chǎn)出的任務(wù)放在隊(duì)列中,消費(fèi)者去隊(duì)列中去消費(fèi):

如果改用有界阻塞隊(duì)列ArrayBlockingQueue,就可以初始化隊(duì)列的大小。則隊(duì)列中元素超過隊(duì)列大小的時(shí)候,生產(chǎn)者就會等待消費(fèi)者消費(fèi)一個(gè)再去生產(chǎn)一個(gè):

測試代碼:

初始化一個(gè)大小為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();
}

測試中,讓生產(chǎn)者生產(chǎn)速度略快,而消費(fèi)者速度略慢一點(diǎn)??梢钥吹缴a(chǎn)出來的產(chǎn)品序號與消費(fèi)的產(chǎn)品序號差始終為10(隊(duì)列的大小):

總結(jié)

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

相關(guān)文章

  • 基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖

    基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖

    本文主要介紹了基于SpringBoot+Redis實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SpringBoot日志信息以及Lombok的常用注解詳析

    SpringBoot日志信息以及Lombok的常用注解詳析

    日志在我們的日常開發(fā)當(dāng)中是必定會用到的,這篇文章主要給大家介紹了關(guān)于SpringBoot日志信息以及Lombok的常用注解的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java 構(gòu)造器原理及用法解析

    Java 構(gòu)造器原理及用法解析

    這篇文章主要介紹了Java 構(gòu)造器原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java封裝類型與基礎(chǔ)類型對比示例分析

    java封裝類型與基礎(chǔ)類型對比示例分析

    這篇文章主要為大家介紹了java封裝類型與基礎(chǔ)類型對比示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • JAVA操作HDFS案例的簡單實(shí)現(xiàn)

    JAVA操作HDFS案例的簡單實(shí)現(xiàn)

    本篇文章主要介紹了JAVA操作HDFS案例的簡單實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹

    Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹

    這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下
    2015-04-04
  • Springboot+WebSocket實(shí)現(xiàn)一對一聊天和公告的示例代碼

    Springboot+WebSocket實(shí)現(xiàn)一對一聊天和公告的示例代碼

    這篇文章主要介紹了Springboot+WebSocket實(shí)現(xiàn)一對一聊天和公告的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java并發(fā)工具類Future使用示例

    Java并發(fā)工具類Future使用示例

    這篇文章主要介紹了Java并發(fā)工具類Future使用示例,本文需要注意future.get()方法是阻塞式的,如果調(diào)用該方法的時(shí)候任務(wù)尚未執(zhí)行完成,則會一直等待下去,直到任務(wù)執(zhí)行結(jié)束,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • Java實(shí)現(xiàn)圖片模糊效果詳解

    Java實(shí)現(xiàn)圖片模糊效果詳解

    圖片模糊是圖像處理中的一種常見效果,它通過平均周圍像素的顏色來使圖像變得模糊,下面我們來看看如何使用Swing庫實(shí)現(xiàn)圖片模糊效果吧
    2025-02-02
  • springboot druid mybatis多數(shù)據(jù)源配置方式

    springboot druid mybatis多數(shù)據(jù)源配置方式

    這篇文章主要介紹了springboot druid mybatis多數(shù)據(jù)源配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

九台市| 嫩江县| 通榆县| 无锡市| 凌云县| 伽师县| 泰兴市| 南川市| 玛沁县| 乌兰察布市| 武宣县| 肃北| 汶上县| 会理县| 汕头市| 永靖县| 乌兰浩特市| 金平| 龙胜| 新民市| 上饶市| 平和县| 上林县| 鄂州市| 沅陵县| 苍梧县| 宿州市| 崇明县| 洞头县| 长寿区| 临清市| 泰州市| 临泽县| 大竹县| 冷水江市| 苍溪县| 昌宁县| 高淳县| 德保县| 武清区| 奉节县|