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 ...
随机推荐
- 2017 清北济南考前刷题Day 3 afternoon
期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...
- vue style width a href动态拼接问题 ?
style width 这个问题 折磨了我一个上午了 好惭愧 因为项目涉及到 进度条 所以必须用行内样式 style 用过vue的都知道 vue中style的用法 大众用法 :style=&quo ...
- vue初尝试--项目结构
新建一个项目之后,我们来看一下项目的目录结构 几个主要文件的内容 index.html文件(入口文件,系统进入之后先进入index.html) <!DOCTYPE html> <ht ...
- python之路--day15--常用模块之logging模块
常用模块 1 logging模块 日志级别:Noset (不设置) Debug---(调试信息)----也可用10表示 Info--(消息信息)----也可用20表示 Warning---(警告信息) ...
- Docker学习笔记 - Docker的镜像
一个容器实际上是运行在宿主机上的一个进程. 只不过在启动这个进程之前进行了一些特殊处理,让这个容器进入了一个全新的虚拟环境,与宿主机的环境分开, 所以这个进程及其子进程认为自己运行在一个独立的世界里面 ...
- 写给 Android 应用工程师的 Binder 原理剖析
写给 Android 应用工程师的 Binder 原理剖析 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理 ...
- 深入理解Javascript单线程谈Event Loop
假如面试回答js的运行机制时,你可能说出这么一段话:"Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后 ...
- jquery楼层效果
- 基于 MySQL 的数据库实践(基本查询)
首先根据准备工作中的操作导入大学模式,打开数据库连接后进入到 MySQL 的交互界面,再使用命令 use db-book; 切换到 db-book 数据库. 单关系查询 SQL 查询的基本结构由三个子 ...
- 物联网 MQTT 服务质量级别
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 翻译人:Tnecesoc,该成员来自云+社区翻译社 消息队列遥测传输(MQTT)是一种客户端服务器发布 / 订阅消息传输协议.它轻量,开放, ...