1. 程式人生 > >JAVA生產者與消費者模式 BlockingQueue與ExecutorService例項

JAVA生產者與消費者模式 BlockingQueue與ExecutorService例項

首先建立生產者:

package ProducerAndConsumer;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class Producer implements Runnable {

	private volatile boolean isRunning = true;
	private BlockingQueue<PCData> queue; // 記憶體緩衝區
	private static AtomicInteger count = new AtomicInteger();
	// 總數,原子操作
	private static final int SLEEPTIME = 1000;

	public Producer(BlockingQueue<PCData> queue) {
		this.queue = queue;
	}

	@Override
	public void run() {

		PCData data = null;
		Random r = new Random();
		System.out.println("start producer id=" + Thread.currentThread().getId());
		try {
			while (isRunning) {
				Thread.sleep(r.nextInt(SLEEPTIME));
				data = new PCData(count.incrementAndGet());// 構造任務資料
				System.out.println(data + "is put into queue");
				if (!queue.offer(data, 2, TimeUnit.SECONDS)) {
					// 提交資料到緩衝區中
					System.err.println("failed to put data:" + data);
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public void stop() {
		isRunning = false;
	}

}
package ProducerAndConsumer;


public class PCData {


<span style="white-space:pre">	</span>private final int intData;


<span style="white-space:pre">	</span>public PCData(int d) {
<span style="white-space:pre">		</span>intData = d;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public PCData(String d) {
<span style="white-space:pre">		</span>intData = Integer.valueOf(d);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public int getData() {
<span style="white-space:pre">		</span>return this.intData;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public String toString() {
<span style="white-space:pre">		</span>return "data:" + intData;
<span style="white-space:pre">	</span>}
}
消費者
package ProducerAndConsumer;

import java.text.MessageFormat;
import java.util.Random;
import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {

	private BlockingQueue<PCData> queue;// 緩衝區
	
	private static final int SLEEPTIME = 1000;

	public Consumer(BlockingQueue<PCData> queue) {
		this.queue = queue;
	}

	@Override
	public void run() {

		System.out.println("start Consumer id=" + Thread.currentThread().getId());
		Random r = new Random(); // 隨機等待時間
		try {

			while (true) {
				PCData data = queue.take();// 提取任務
				if (null != data) {
					int re = data.getData() * data.getData();// 計算平方
					System.out.println(MessageFormat.format("{0}*{1}={2}",
							data.getData(), data.getData(), re));
					Thread.sleep(r.nextInt(SLEEPTIME));
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

主函式
package ProducerAndConsumer;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {

	public static void main(String[] args) {

		try {
			// 建立緩衝區
			BlockingQueue<PCData> queue = new LinkedBlockingQueue<PCData>(10);
			Producer producer1 = new Producer(queue);// 建立生產者
			Producer producer2 = new Producer(queue);
			Producer producer3 = new Producer(queue);

			Consumer consumer1 = new Consumer(queue);// 建立消費者
			Consumer consumer2 = new Consumer(queue);
			Consumer consumer3 = new Consumer(queue);

			ExecutorService service = Executors.newCachedThreadPool();// 建立執行緒池

			service.execute(producer1);// 執行生產者
			service.execute(producer2);
			service.execute(producer3);

			service.execute(consumer1);// 執行消費者
			service.execute(consumer2);
			service.execute(consumer3);

			Thread.sleep(10 * 1000);

			producer1.stop();// 停止生產者
			producer2.stop();
			producer3.stop();

			Thread.sleep(3000);

			service.shutdown();

		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
}
執行結果




相關推薦

JAVA生產者消費者模式 BlockingQueueExecutorService例項

首先建立生產者: package ProducerAndConsumer; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Ti

java生產者消費者模式

食物 會有 實現 條件 3.2 釋放 tac lee trace 前言: 生產者和消費者模式是我們在學習多線程中很經典的一個模式,它主要分為生產者和消費者,分別是兩個線程, 目錄 一:生產者和消費者模式簡介 二:生產者和消費者模式的實現 聲明:本例來源於java經典著作:《

Java並發編程(4)--生產者消費者模式介紹

定義 一點 ava empty 釋放 nal cond 場景 inter 一、前言   這種模式在生活是最常見的,那麽它的場景是什麽樣的呢? 下面是我假象的,假設有一個倉庫,倉庫有一個生產者和一個消費者,消費者過來消費的時候會檢測倉庫中是否有庫存,如果沒有了則等待生產,如

Java併發程式設計(4)--生產者消費者模式介紹

一、前言   這種模式在生活是最常見的,那麼它的場景是什麼樣的呢? 下面是我假象的,假設有一個倉庫,倉庫有一個生產者和一個消費者,消費者過來消費的時候會檢測倉庫中是否有庫存,如果沒有了則等待生產,如果有就先消費直至消費完成;而生產者每天的工作就是先檢測倉庫是否有庫存,如果沒有就開始生產,滿倉了就停止生產等待

Java生產者消費者模式的簡單寫法

生產者消費者模式是研究多執行緒程式的經典問題之一,它描述是有一塊緩衝區作為快取佇列/倉庫,生產者可以將產品放入佇列,消費者則可以從佇列中取走產品。大多數的後臺服務程式併發控制的基本原理都可以歸納為生產者消費者模式。 1、使用Synchronized()、wait() 、 n

java多執行緒--ReentrantLock實現生產者消費者模式

一.本例實現 :一對一交替列印, 一.生產者邏輯 :每次只允許一個生產者來進行生產操作(生產者之間互斥訪問倉庫),必須等消費者取走資料之後,才能進行下一次的生產 二.消費者邏輯 :每次只允許一個消費者來進行生產操作(消費者之間互斥訪問倉庫),必須等生產者生產資料之後,才能

python 中生產者消費者 模式

生產者與消費者 模式 摘要: 最近一段時間,寫了一些生產者與消費者模型, 特此此文 作為總結. 文中總結了不同的 生產者與消費者的情況. 一個生產者, 多個消費者,與一個生產者,多個消費者 的程式設計模式. 一. 生產者與消費者 在軟體開發的過程中,經常碰

程式碼編寫生產者消費者模式思路

##   **目前有個任務是建立大量的資料同時向kafka裡寫入,於是之前開了大量的執行緒建立資料並寫入,發現kafka並不能連線那麼多執行緒,後來就用到生產者與消費者模式,大量的執行緒生產資料放入佇列中,然後只開幾個執行緒從佇列中獲取並寫入kafka.**      

學習筆記- 自己寫的關於生產者消費者模式,還有定時任務的demo。

為了加深對生產者消費者模式的理解,特意寫了這個demo,裡面還包含了一個自己寫的定時任務。程式碼下載地址:http://download.csdn.net/detail/li_yan_fei/9811572 是個maven專案,只用了spring框架。 學到的內容有3個

實現生產者消費者模式

產品 style 等待 pytho ask 緩沖 制造 目錄 tex 實現生產者與消費者模式 目錄 生產者與消費者模式 實現 生產者與消費者模式 什麽是生產者消費者模式 生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼

生產者消費者模式(執行緒的同步互斥)

條件變數 條件變數的提出首先要涉及一個概念,就是生產者消費者模型: 生產者消費者,是在多執行緒同步的一個問題,兩個固定大小緩衝區的執行緒,在實際執行是會發生問題,生產者是生成資料放入緩衝區,重複過程,消費者在緩衝區取走資料。 生產者消費者的模型提出了三種關係,兩種角色,

多執行緒實現生產者消費者模式

生產者-消費者模式的簡介: 在實際的軟體開發過程中,我們將產生資料的模組稱為生產者,處理資料的模組成為消費者。但僅有這兩者還不夠成為一個生產者-消費者模式,還需要有一個緩衝區(一段記憶體區域)作為中介,生產者產生的資料放入緩衝區,消費者從緩衝區讀取資料並處理。

IOS多執行緒使用GCD訊號量實現生產者消費者模式

一、原理的簡述   在生產者消費者模式當中,首先需要分清在這個模式當中有哪些角色? 各角色分別擔任什麼職責與它們之間的關係如何? 角色之間是在保證資料的準確性的情況下如何通訊(同步資料)的? 假設現在有一個這樣的情形: 有兩個人共同訪問一個容量有限的倉庫,這2個人,

九、生產者消費者模式

# 生產者消費者模式 - 生產者消費者模式是程式設計中非常常見的一種設計模式,被廣泛運用在解耦、訊息佇列等場景。 - - 使用生產者消費者模式通常需要在兩者之間增加一個阻塞佇列作為媒介,有了媒介之後就相當於有了一個緩衝,平衡了兩者的能力。 - 整體如上圖所示,最上面是阻塞佇列,右側的 1 是生產者執行緒

JAVA 多執行緒(生產者消費者模式

在生產-消費模式中:通常由兩類執行緒,即若干個生產者的執行緒和若干個消費者的執行緒。生產者執行緒負責提交使用者請求,消費者執行緒則負責具體處理生產者提交的任務,在生產者和消費者之間通過共享記憶體快取區進行通訊。 主要構成: provider:生產者執行緒負責生產資料 consume

Java多執行緒基礎之手撕生產者消費者模式

問題描述 資料結構: 生產者/消費者 快取區(共享資源) 規則: 生產/消費者同時操作快取區。 當快取區為空的時候,消費者不能消費,即消費者阻塞。 當快取區為滿的時候,生產者不能生產,即生產者阻

Java執行緒協作--生產者消費者模式

    生產者消費者模式是執行緒協作的經典應用,主要由具體產品類,容器類,生產者執行緒,消費者執行緒組成。具體表現形式為生產者執行緒生產產品往容器裡放置,當容器滿的時候,生產執行緒呼叫wait方法,使當前執行緒阻塞,而此時消費者執行緒在不斷的消費容器裡的產品,同時呼叫noti

Java中通過wait和notify來實現生產者消費者模式

今天通過介紹一下如何通過wait和notify來實現生產者和消費者模式。 通過synchronized同步程式碼塊實現執行緒的同步操作,從而保證資料的一致性。下面具體介紹一下這個模式的實現過程。 1.首先編寫一個生產者類: public class Producer imp

在並發編程中使用生產者消費者模式能夠解決絕大多數並發問題。該模式通過平衡生產線程和消費線程的工作能力來提高程序的整體處理數據的速度。

容器 模板類 負責 速度 線程並發 進行 並發 耦合 所有 在並發編程中使用生產者和消費者模式能夠解決絕大多數並發問題。該模式通過平衡生產線程和消費線程的工作能力來提高程序的整體處理數據的速度。 在並發編程中使用生產者和消費者模式能夠解決絕大多數並發問題。該模式通過平衡

多線程之生產者消費者模式

多線程多線程生產者只有多個生產者,多個消費者!這裏不講基礎的知識。代碼如下package Thread; class Resource { private String name; private int count=0; private boolean flag=false;