java实现生产者/消费者的三种方式
package com.wenki.thread; import java.util.LinkedList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProductAndConsume { public static void main(String[] args) { ProductAndConsume o = new ProductAndConsume(); // Storage storage = o.new StorageOne(); // Storage storage = o.new StorageTwo(); Storage storage = o.new StorageThree(); Consumer consumer1 = o.new Consumer(storage); Consumer consumer2 = o.new Consumer(storage); Producter producter1 = o.new Producter(storage); Producter producter2 = o.new Producter(storage); Producter producter3 = o.new Producter(storage); consumer1.start(); consumer2.start(); producter1.start(); producter2.start(); producter3.start(); } class Producter extends Thread{ Storage storage; public Producter(Storage storage) { this.storage = storage; } public void product(){ this.storage.product(); } @Override public void run() { for(;;){ product(); } } } class Consumer extends Thread{ Storage storage; public Consumer(Storage storage){ this.storage = storage; } public void consume(){ this.storage.consume(); } @Override public void run() { for(;;){ consume(); } } } interface Storage{ int MAX_SIZE = 100; LinkedList<Object> list = new LinkedList<Object>(); public abstract void product(); public abstract void consume(); } //第一种方式 wait() + notify() class StorageOne implements Storage{ @Override public void product() { synchronized (list) { while(list.size() == MAX_SIZE){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(list.add(new Object())){ System.out.println("生产 ### 产品数量 : " + list.size()); //通知消费者可以继续消费 list.notifyAll(); } try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void consume() { synchronized (list) { while(list.size() == 0){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(list.remove() != null){ System.out.println("消费 ### 产品数量: " + list.size()); //通知生产者可以继续生产 list.notifyAll(); } try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //第二种方式 await() + signal() class StorageTwo implements Storage{ Lock lock = new ReentrantLock(); Condition fully = lock.newCondition(); Condition empty = lock.newCondition(); @Override public void product() { lock.lock(); try{ while(list.size() == MAX_SIZE){ fully.await(); } if(list.add(new Object())){ System.out.println("生产 ### 产品数量 : " + list.size()); empty.signalAll(); } TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } @Override public void consume() { lock.lock(); try{ while(list.size() == 0){ empty.await(); } if(list.remove() != null){ System.out.println("消费 ### 产品数量: " + list.size()); fully.signalAll(); } TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } } } //第三种 BlockingQueue 阻塞队列 class StorageThree implements Storage{ LinkedBlockingQueue<Object> list = new LinkedBlockingQueue<Object>(MAX_SIZE); @Override public void product() { try { list.put(new Object()); System.out.println("生产 ### 产品数量 : " + list.size()); TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void consume() { try { if(list.take() != null){ System.out.println("消费 ### 产品数量: " + list.size()); } TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
java实现生产者/消费者的三种方式的更多相关文章
- java 实现md5加密的三种方式与解密
java 实现md5加密的三种方式 CreateTime--2018年5月31日15点04分 Author:Marydon 一.解密 说明:截止文章发布,Java没有实现解密,但是已有网站可以免费 ...
- java中遍历集合的三种方式
第一种遍历集合的方式:将集合变为数组 package com.lw.List; import java.util.ArrayList; import java.util.List; import ja ...
- java加载配置文件的三种方式
比如我们要加载db.properties文件 如图: 比如我们要加载source目录下的db.properties文件.就有以下几种方式 第一种是文件io流: public static void l ...
- JAVA实现Base64编码的三种方式
摘要: Javabase64编码的三种方式 有如下三种方式: 方式一:commons-codec.jar Java代码 1. String base64String="whuang12 ...
- Java通过JDBC连接数据库的三种方式!!!并对数据库实现增删改查
前言 java连接数据库完整流程为: 1,获得驱动(driver),数据库连接(url),用户名(username),密码(password)基本信息的三种方式. 2,通过获得的信息完成JDBC实现连 ...
- java实现HTTP请求的三种方式
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...
- 【转载】java实现HTTP请求的三种方式
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...
- Java 实现线程安全的三种方式
一个程序在运行起来的时候会转换成进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如显示生活中,银行取钱问题.火车 ...
- HTTP:Java实现HTTP请求的三种方式
目前JAVA实现HTTP请求的方法用的最多的有两种: 一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,H ...
随机推荐
- IntelliJ IDEA插件——冷门神器分享
IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件. 前言 IDEA自不必说,IDEA插件是开发中必备的神器,相 ...
- Scala 操作符与提取器
实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...
- Crontab定时备份数据库
1.创建一个shell脚本文件 cd /usr mkdir dbbackup cd /usr/dbbackup vim backup.sh echo "------------------- ...
- WPF 自定义RadioButton样式
一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...
- python开发:初识python
python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...
- [Luogu1801] 黑匣子 - Treap
Description Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命 ...
- asp.net core 三 Nuget包管理
参考连接:http://www.cnblogs.com/netcore2/p/7412891.html 这里的说明,基本就是学习了别人的文章,自己做了个备份 asp.net c ...
- JS事件练习题
1.点击按钮连续弹窗5次 <div class="noe"> <div class="noe1" onClick="n()" ...
- WebGL之通过外部传入a_PontSize值改变点着色器vshader内置变量gl_PointSize的值
最近分配到一个看起来非常简单的优化需求.通过地图上设置工具来改变地图上显示的点的大小和透明度.无非过程就是从控件面板获取到用户设置的值保存到数据库中.然后地图上画点的时候取出设置的值渲染出点即可.前端 ...
- 初始Spring MVC——练手小项目
初始Spring MVC 前几天开始了我的spring学习之旅,由于之前使用过MVC模式来做项目,所以我先下手的是 Spring MVC,做个练手项目,非常简单 项目介绍: 用户输入信息 -> ...