`
xmong
  • 浏览: 259115 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程设计模式之生产者与消费者

阅读更多


Java实现多线程生产者与消费者:

生产者线程负责生产产品,将产品保存到产品队列中,消费者负责从队列中取出产品消费。产品队列有一定的容量,当产品队列中没有产品时,消费者线程必须等待生产者线程生产产品,当产品队列中产品数量达到队列容量时,生产者等待消费者消费产品。
设计如下:
Product:产品类存储产品信息
ProductQueue:产品队列负责存储产品
ProducerThread:生产者线程负责生产产品
ConsumerThread:消费者线程负责消费产品
Main:程序入口

实现如下:
Product:产品类
package com.thread.product;

/**
 * 产品类
 * @author Administrator
 *
 */
public class Product {

	
	/**
	 * 产品名称
	 */
	private final String name;
	
	public Product(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	public String toString(){
		return "{product."+name+"}";
	}
	
}


ProductQueue:产品队列类

package com.thread.product;

import java.util.LinkedList;

/**
 * 产品队列类
 * @author Administrator
 *
 */
public class ProductQueue {

	/**
	 * 存储产品的队列
	 */
	private final LinkedList<Product> products = new LinkedList<Product>();
	/**
	 * 队列的容量大小
	 */
	private final int size;
	
	public ProductQueue(int size){
		this.size = size;
	}
	
	/**
	 * 向队列中添加产品,判断队列中产品大小是否达到了容量大小,
	 * 如果达到了当前生产线程等待,唤醒其他线程。
	 * 如果没有达到,当前生产线程向队列中添加产品。
	 * @param product
	 */
	public synchronized void putProduct(Product product){
		
		while(products.size() > size){//判断队列中产品是否达到队列容量
			try {
				System.out.println(Thread.currentThread().getName()+" {putProduct wait}");
				wait();//生产线程等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		products.addLast(product);//添加产品
		System.out.println(Thread.currentThread().getName()+" putProduct "+product);
		notifyAll();//唤醒其他等待线程
	};
	
	
	/**
	 * 获取队列中的产品,判断队列中是否存在产品,
	 * 如果没有则当前消费线程等待。
	 * 如果有则当前消费线程取出产品,唤醒其他等待线程。
	 * @return
	 */
	public synchronized Product getProduct(){
		
		while(products.size() <= 0){//判断是否队列中是否存在产品
			try {
				System.out.println(Thread.currentThread().getName()+" {getProduct wait}");
				wait();//消费线程等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Product product = products.removeFirst();//取出产品
		System.out.println(Thread.currentThread().getName()+" getProduct "+product);
		notifyAll();//唤醒其他线程
		return product;
	};
	
}

ProducerThread:生产者类
package com.thread.product;

import java.util.Random;

/**
 * 生产产品线程类
 * @author Administrator
 *
 */
public class ProducerThread extends Thread{

	
	private ProductQueue productQueue;
	private Random random = new Random();
	
	public ProducerThread(String name, ProductQueue queue){
		super(name);
		this.productQueue = queue;
	}
	
	/**
	 * 循环生产产品
	 */
	public void run(){
		int count = 0;
		while(true){
			Product product = new Product("product."+count+"."+this.getName());
			productQueue.putProduct(product);
			count++;
			try {
				Thread.sleep(random.nextInt(1000));//随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

ConsumerThread:消费者类

package com.thread.product;

import java.util.Random;


/**
 * 消费者线程类
 * @author Administrator
 *
 */
public class ConsumerThread extends Thread{

	
	private ProductQueue productQueue;
	private Random random = new Random();
	
	public ConsumerThread(String name, ProductQueue queue){
		super(name);
		this.productQueue = queue;
	}
	
	/**
	 * 循环消费产品
	 */
	public void run(){
		while(true){
			productQueue.getProduct();
			try {
				Thread.sleep(random.nextInt(1400));//随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

Main:main类

package com.thread.product;

/**
 * main类
 * @author Administrator
 *
 */
public class Main {

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		//初始化产品队列容量为5
		ProductQueue queue = new ProductQueue(5);
		//启动两个生产产品线程实例,a和b
		new ProducerThread("ProducerThread.a", queue).start();
		new ProducerThread("ProducerThread.b", queue).start();
		//启动两个消费者线程实例,a和b
		new ConsumerThread("ConsumerThread.a", queue).start();
		new ConsumerThread("ConsumerThread.b", queue).start();
	}
	
	
}


执行结果:

ProducerThread.b putProduct {product.product.0.ProducerThread.b}
ProducerThread.a putProduct {product.product.0.ProducerThread.a}
ConsumerThread.a getProduct {product.product.0.ProducerThread.b}
ConsumerThread.b getProduct {product.product.0.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ProducerThread.a putProduct {product.product.1.ProducerThread.a}
ConsumerThread.b getProduct {product.product.1.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ConsumerThread.a {getProduct wait}
ProducerThread.a putProduct {product.product.2.ProducerThread.a}
ConsumerThread.a getProduct {product.product.2.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ConsumerThread.a {getProduct wait}
ProducerThread.b putProduct {product.product.1.ProducerThread.b}
ConsumerThread.a getProduct {product.product.1.ProducerThread.b}
ConsumerThread.b {getProduct wait}
ProducerThread.b putProduct {product.product.2.ProducerThread.b}
ConsumerThread.b getProduct {product.product.2.ProducerThread.b}
ConsumerThread.b {getProduct wait}
ProducerThread.b putProduct {product.product.3.ProducerThread.b}
ConsumerThread.b getProduct {product.product.3.ProducerThread.b}
ProducerThread.a putProduct {product.product.3.ProducerThread.a}
ProducerThread.b putProduct {product.product.4.ProducerThread.b}
ProducerThread.a putProduct {product.product.4.ProducerThread.a}
ProducerThread.a putProduct {product.product.5.ProducerThread.a}
ConsumerThread.a getProduct {product.product.3.ProducerThread.a}
ProducerThread.b putProduct {product.product.5.ProducerThread.b}
ConsumerThread.b getProduct {product.product.4.ProducerThread.b}
ConsumerThread.b getProduct {product.product.4.ProducerThread.a}
ProducerThread.a putProduct {product.product.6.ProducerThread.a}
ConsumerThread.a getProduct {product.product.5.ProducerThread.a}
ProducerThread.a putProduct {product.product.7.ProducerThread.a}
ProducerThread.b putProduct {product.product.6.ProducerThread.b}
ProducerThread.a putProduct {product.product.8.ProducerThread.a}
ProducerThread.b putProduct {product.product.7.ProducerThread.b}
ConsumerThread.b getProduct {product.product.5.ProducerThread.b}
ConsumerThread.a getProduct {product.product.6.ProducerThread.a}
ProducerThread.a putProduct {product.product.9.ProducerThread.a}
ProducerThread.b putProduct {product.product.8.ProducerThread.b}
ConsumerThread.b getProduct {product.product.7.ProducerThread.a}
ProducerThread.a putProduct {product.product.10.ProducerThread.a}
ConsumerThread.a getProduct {product.product.6.ProducerThread.b}
ProducerThread.a putProduct {product.product.11.ProducerThread.a}
ConsumerThread.b getProduct {product.product.8.ProducerThread.a}
ConsumerThread.b getProduct {product.product.7.ProducerThread.b}
ProducerThread.b putProduct {product.product.9.ProducerThread.b}
ProducerThread.a putProduct {product.product.12.ProducerThread.a}
ConsumerThread.a getProduct {product.product.9.ProducerThread.a}
ConsumerThread.b getProduct {product.product.8.ProducerThread.b}
ProducerThread.b putProduct {product.product.10.ProducerThread.b}
ProducerThread.a putProduct {product.product.13.ProducerThread.a}
ProducerThread.b {putProduct wait}
ConsumerThread.a getProduct {product.product.10.ProducerThread.a}
ProducerThread.b putProduct {product.product.11.ProducerThread.b}
ProducerThread.a {putProduct wait}
ConsumerThread.b getProduct {product.product.11.ProducerThread.a}
ProducerThread.a putProduct {product.product.14.ProducerThread.a}
ProducerThread.b {putProduct wait}
ConsumerThread.a getProduct {product.product.9.ProducerThread.b}
ProducerThread.b putProduct {product.product.12.ProducerThread.b}
ConsumerThread.b getProduct {product.product.12.ProducerThread.a}
ProducerThread.a putProduct {product.product.15.ProducerThread.a}
ProducerThread.a {putProduct wait}
。。。。。。




分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码).zip

    java多线程设计模式详解,包括了单线程,生产者和消费者,各种线程方法的解释!

    Java多线程并发生产者消费者设计模式实例解析

    主要介绍了Java多线程并发生产者消费者设计模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java常用并发设计模式精讲

    Java常用并发设计模式精讲 内容简介: 1、优雅终止线程的设计模式 2、避免共享的设计模式 3、多线程版本的if模式 4、多线程分工模式 5、生产者 - 消费者模式的优点 6、过饱问题解决方案

    java设计模式

    30.2.2 按建造者模式生产车辆 30.2.3 最佳实践 第31章 结构类模式大PK 31.1 代理模式VS装饰模式 31.1.1 代理模式 31.1.2 装饰模式 31.1.3 最佳实践 31.2 装饰模式VS适配器模式 31.2.1 按装饰模式描述丑小鸭 31.2.2 ...

    【十三】Java多线程(指尖上的多线程[超详细])

    五、多线程之消费者与生产者、死锁 六、线程通信(实例详解) 七、线程池 八、线程安全的集合 思维导图参考: 【十三】Java多线程思维导图 一、什么是线程 什么是进程 什么是线程 线程,又称轻量级进程(Light ...

    基于log4j的java异步Log的打印实现

    使用消费者-生产者模式为主要指导思想设计的多线程log打印的一个通用模块类。基于log4j,但是不需要进行特别配置,不需要单独写配置文件,自带配置文件。仅需要简单的修改即可实现smtp远程log模式。 经测验,1000条...

    深入浅出设计模式(中文版电子版)

    5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例...

    深入浅出设计模式(中文版)

    5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例...

    JAVA高并发高性能高可用高扩展架构视频教程

    高并发之单(多)生产者消费者线程 高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    米哈游笔试题目-Java方向.docx

    生产者-消费者模型:需要设计一个多线程程序,其中有多个生产者和多个消费者,生产者不断产生数据放入共享队列,消费者从队列中取出数据进行消费。 线程池类:需要设计一个线程池类,能够动态管理线程数量,支持可...

    Java并发编程原理与实战

    通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...

    Java开发详解.zip

    030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记.pdf 030906_【第9章:多线程】_线程生命周期笔记.pdf 031001_【第10章:泛型】_泛型入门笔记.pdf 031002_【第10章:泛型】_通配符笔记.pdf 031003_...

    Java八股文最新消息中间件面试宝典

    包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。 **面试官**:RabbitMQ-如何...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ProtoStuff 高性能序列化 - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - 原子变量 - 内置锁 - ...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    Java优化编程(第2版)

    9.5 优化消息目的地destination及消息生产者与消费者 9.6 优化消息对象及合理使用事务机制 9.7 影响jms性能的其他因素 小结 …… 第12章 java多线程技术与应用性能优化 12.1 java多线程技术 12.1.1 进程与线程 ...

Global site tag (gtag.js) - Google Analytics