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 ...
随机推荐
- .NET Core装饰模式和.NET Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- UTF-8 UTF-16 UTF-32 最根本的区别?
昨天看书的时候突然发现UTF-16 我好像还没见过这个东西 也可能忘记了 反正现在对自己科普一下吧 最根本的区别 UTF-32 把所有的字符都用32bit -- 4个字节 来表示 UTF-16 和 ...
- Linux的安装和使用技巧
LinuxCentOs开始设置一个普通的用户,如果想进入root用户,可以su然后设置密码,然后第二次再次输入su,然后输入相同的密码就可以进去了 有很多命令需要在root下才能执行,但是在创建时却是 ...
- 记一次oracle crs无法重启事故
今天在修改了数据库参数后,关闭数据库及crs,然后重新启动了服务器,服务器启动完成之后,发现数据库无法启动,过程如下: step1:重启数据库 $ su - grid $ srvctl stop da ...
- C语言学习(二)
今天在程序员面试题中,碰到一个有意思的题目:数组a[N],存放了1至N-1个数,其中某个数重复一次,现在要求找出重复的数字且程序时间复杂度必须为O(N).乍一看,如果不计时间复杂度和空间复杂度程序比较 ...
- 快速搭建ssm框架
快速搭建SSM框架 因为最近有很多朋友问我自己的项目搭建的不够完善,并且经常出现一些小问题,那么今天我又整理了一下文档教大家如何快速搭建SSM框架我是用 eclipse搭建的,如果想用idear的话我 ...
- 新概念英语(1-73)The way to King Street
The way to King Street 到国王街的走法Why did the man need a phrasebook?Last week Mrs. Mills went to London. ...
- JavaScript的作用域链
/* js当中 每个函数都是一个执行环境 函数调用函数会进入新的执行环境结束之后再回来当前 作用域链: 在内部的作用域中可以访问和修改外部的变量 在外部作用域不能修改或者访问内部的变量 */ var ...
- React-Native(二):React Native开发工具vs code配置
从网上翻阅了一些开发react-native的开发工具时,发现其实可选的工具还是比较多的Sublime Text,WebStrom,Atom+Nuclide,vs code 等.因为我用.net生态环 ...
- Tensorflow计算模型 —— 计算图
转载自:http://blog.csdn.net/john_xyz/article/details/69053626 Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图 ...