文档章节

java生产者消费者模式

mifans
 mifans
发布于 2017/03/28 13:26
字数 330
阅读 8
收藏 0

生产者

package com.jia.concurrency;

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.err.println("start producer id="+Thread.currentThread().getId());
		try {
			while (isRunning) {
				Thread.sleep(r.nextInt(SLEEPTIME));
				data=new PCData(count.incrementAndGet());// 构造任务数据
				System.err.println(data+"is put into queue");
				if (!queue.offer(data,2,TimeUnit.SECONDS)){//提交数据到缓冲区
					System.err.println("failed to put data"+data);
				}
			} 
		} catch (Exception e) {
			e.printStackTrace();
			Thread.currentThread().interrupt();
		}
	}

	public void stop(){
		isRunning=false;
	}
}

消费者

package com.jia.concurrency;

import java.text.MessageFormat;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

import org.omg.CORBA.CurrentHolder;

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.err.println("start Consumer id="+Thread.currentThread().getId());
		Random r=new Random();//随机时间
		try {
			while (true) {
				PCData data=queue.take();
				if(null!=data){
					int re=data.getIntData()*data.getIntData();
					System.err.println(MessageFormat.format("{0}*{1}={2}", data.getIntData(),data.getIntData(),re));
					Thread.sleep(r.nextInt(SLEEPTIME));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			Thread.currentThread().interrupt();
		}
		
	}
	public static void main(String[] args) throws InterruptedException {
		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();
	}

}

共享数据模型

package com.jia.concurrency;

public class PCData {

	private final int intData;
	public PCData(int d){
		this.intData=d;
	}
	public int getIntData() {
		return intData;
	}
	@Override
	public String toString() {
		return "PCData [intData=" + intData + "]";
	}
	
}

 

© 著作权归作者所有

mifans
粉丝 11
博文 204
码字总数 103669
作品 0
海淀
程序员
私信 提问
RabbitMQ 入门指南(Java)

RabbitMQ是一个受欢迎的消息代理,通常用于应用程序之间或者程序的不同组件之间通过消息来进行集成。本文简单介绍了如何使用 RabbitMQ,假定你已经配置好了rabbitmq服务器。 RabbitMQ是用Erl...

oschina
2013/06/21
91.2K
22
SpringBoot 整合 kafka 实现组订阅模式

SpringBoot 整合 kafka 实现组订阅模式: 工程结构图 消息生产者pom.xml配置 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" </project> 消息消......

泉天下
2018/10/18
673
0
ActiveMQ : Async error occurred: java.lang.OutO...

参考--http://activemq.apache.org/javalangoutofmemory.html 对于MQ的内容实用是可管理和可配置的。首先需要判断的是MQ的哪部分系统因内存不足而导致泄漏,是JVM,broker还是消费者、生产者...

hbdrawn
2011/06/28
1K
0
Apache ActiveMQ Queue Topic 详解

一、特性及优势 1、实现 JMS1.1 规范,支持 J2EE1.4以上 2、可运行于任何 jvm和大部分 web 容器(ActiveMQ works great in any JVM) 3、支持多种语言客户端(java, C, C++, AJAX, ACTIONSCR...

蔡少东
2015/01/12
610
0
Java多线程生产者消费者实例

Java生产者消费者实例 设计:涉及到的类有食物、厨师、服务员、顾客以及测试类。厨师负责生产食物,服务员服务于顾客,顾客负责点餐以及吃饭。 技术点:Java多线程,线程安全(synchronized),...

cicadaT
2017/11/05
856
1

没有更多内容

加载失败,请刷新页面

加载更多

如何快速为网站选择合适的SSL证书

随着HTTPS普及,越来越多用户开始采用SSL证书,来对HTTP进行加密,升级到HTTPS。但面对各种不同的SSL证书,用户应如何选择?安信SSL证书将为大家讲解: 一、按SSL证书类型选择 DV SSL证书:域...

安信证书
30分钟前
2
0
被嫌弃的eval和with

本文转载于:专业的前端网站➥被嫌弃的eval和with 前面的话   eval和with经常被嫌弃,好像它们的存在就是错误。在CSS中,表格被嫌弃,在网页中只是用表格来展示数据,而不是做布局,都可能被...

前端老手
32分钟前
4
0
Allegro非常实用的快捷键-PCB环境

立题简介: 内容:简单介绍Allegro绘制的PCB环境下的快捷键; 来源:实际使用得出; 作用:对Allegro绘制PCB快捷键进行介绍; PCB环境:Cadence 16.6; 立题详解: 对“allegro”板而言,其在...

demyar
39分钟前
1
0
润乾报表与 ActiveReport JS 功能对比

简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片、不规则分组、自由格间运算、行列对称等技术,使得复杂报表...

泡泡糖儿
40分钟前
1
0
仿微信打飞机游戏网页版,基于cocos2d-js游戏引擎,在线试玩,内含源码

早几年研究cocos2d的demo项目,这个是基于cocos2d-js游戏引擎,整个游戏用js编写。 玩法:鼠标拖动飞机移动即可 试玩地址 源码地址 游戏截图: 文件说明 cocos2dx:游戏引擎 res:存放游戏素...

tanghc
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部