- 浏览: 259115 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
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 validation(java验证器实现)
2014-03-18 11:45 3639Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 812Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9131. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1648Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 999Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2618Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1787Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4487Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1545Java实现多线程读写数据 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1548Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2439Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 90681,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1921安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3063图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2863JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3471JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1515Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1319代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2530Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
java多线程设计模式详解,包括了单线程,生产者和消费者,各种线程方法的解释!
主要介绍了Java多线程并发生产者消费者设计模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java常用并发设计模式精讲 内容简介: 1、优雅终止线程的设计模式 2、避免共享的设计模式 3、多线程版本的if模式 4、多线程分工模式 5、生产者 - 消费者模式的优点 6、过饱问题解决方案
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多线程思维导图 一、什么是线程 什么是进程 什么是线程 线程,又称轻量级进程(Light ...
使用消费者-生产者模式为主要指导思想设计的多线程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实例...
高并发之单(多)生产者消费者线程 高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
生产者-消费者模型:需要设计一个多线程程序,其中有多个生产者和多个消费者,生产者不断产生数据放入共享队列,消费者从队列中取出数据进行消费。 线程池类:需要设计一个线程池类,能够动态管理线程数量,支持可...
通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...
030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记.pdf 030906_【第9章:多线程】_线程生命周期笔记.pdf 031001_【第10章:泛型】_泛型入门笔记.pdf 031002_【第10章:泛型】_通配符笔记.pdf 031003_...
包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。 **面试官**:RabbitMQ-如何...
- 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ProtoStuff 高性能序列化 - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - 原子变量 - 内置锁 - ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
9.5 优化消息目的地destination及消息生产者与消费者 9.6 优化消息对象及合理使用事务机制 9.7 影响jms性能的其他因素 小结 …… 第12章 java多线程技术与应用性能优化 12.1 java多线程技术 12.1.1 进程与线程 ...