生产者消费者ReentrantLock实现以及BlockingQueue实现
1.ReentrantLock实现
/*** 描述: 一个初始值为0的变量,两个线程对其交替操作,一个加一个减** @author xinjiao.yu@marketin.cn* @create 2020/2/22 11:55* @since 2.16.3*/
class ShareData{private int number = 0;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void increment() throws Exception{lock.lock();try{// 1判断while(number != 0){// 等待,不能生产condition.await();}number++;System.out.println(Thread.currentThread().getName()+"\t"+number);// 通知唤醒condition.signalAll();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}public void decrement() throws Exception{lock.lock();try{// 1判断while(number == 0){// 等待,不能生产condition.await();}number--;System.out.println(Thread.currentThread().getName()+"\t"+number);// 通知唤醒condition.signalAll();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}
public class ProConsumer_ReentrantLockDemo {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(()->{for(int i=1;i<=5;i++){try{shareData.increment();}catch (Exception e){e.printStackTrace();}}},"AA").start();new Thread(()->{for(int i=1;i<=5;i++){try{shareData.decrement();}catch (Exception e){e.printStackTrace();}}},"BB").start();}
}
2.BlockingQueue实现
class MyResource{private volatile boolean FLAG = true;private AtomicInteger atomicInteger = new AtomicInteger();private BlockingQueue<String> blockingQueue = null;// 构造方法注入public MyResource(BlockingQueue<String> blockingQueue){this.blockingQueue = blockingQueue;System.out.println(blockingQueue.getClass().getName());}public void myProd() throws Exception{String data = null;boolean retValue;while (FLAG){data = atomicInteger.incrementAndGet()+"";retValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);if(retValue){System.out.println(Thread.currentThread().getName()+"\t 插入队列"+data+"成功");}else {System.out.println(Thread.currentThread().getName()+"\t 插入队列"+data+"失败");}TimeUnit.SECONDS.sleep(1);}System.out.println(Thread.currentThread().getName()+"\t 大老板叫停了,表示FLAG=false,生产动作结束");}public void myConsumer() throws Exception{String result = null;while (FLAG){result = blockingQueue.poll(2L,TimeUnit.SECONDS);if(null == result || result.equalsIgnoreCase("")){FLAG = false;System.out.println(Thread.currentThread().getName()+"\t 超过2秒钟没有取到蛋糕,消费退出");System.out.println();return;}System.out.println(Thread.currentThread().getName()+"\t 消费队列"+result+"成功");}}public void myStop() throws Exception{this.FLAG=false;}
}
public class ProConsumer_BlockQueueDemo {public static void main(String[] args) throws Exception{MyResource myResource = new MyResource(new ArrayBlockingQueue<>(3));new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 生产者线程启动");try {myResource.myProd();} catch (Exception e) {e.printStackTrace();}},"Prod").start();new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 消费者线程启动");try {myResource.myConsumer();} catch (Exception e) {e.printStackTrace();}},"Consumer").start();// 暂停一会线程TimeUnit.SECONDS.sleep(5);System.out.println();System.out.println();System.out.println("5秒钟时间到,大老板main线程叫停,活动结束");myResource.myStop();}
}
生产者消费者ReentrantLock实现以及BlockingQueue实现相关推荐
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- 【1】生产者-消费者模型的三种实现方式
(手写生产者消费者模型,写BlockingQueue较简便 ) 1.背景 ...
- Java并发编程(二十三)------并发设计模式之生产者消费者模式
参考文章:Java实现生产者消费者问题与读者写者问题 目录 1. 生产者消费者问题 1.1 wait() / notify()方法 1.2 await() / signal()方法 1.2.1 对sy ...
- 【生产者消费者模型】
Linux生产者消费者模型 生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 基于阻塞队列的生产者消费者模型 模 ...
- 【Linux篇】第十六篇——生产者消费者模型
生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产消费者模型 基于阻塞队列的生产者消费者模型 模拟实现基于阻塞队列的生产消费模 ...
- Linux生产者消费者模型
文章目录 生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 基于阻塞队列的生产者消费者模型 模拟实现基于阻塞队列 ...
- 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说
目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...
- Java多线程(十):BlockingQueue实现生产者消费者模型
BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
- 生产者-消费者中的缓冲区:BlockingQueue接口
BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...
最新文章
- go var type 互转_Go语言学习笔记(第九章) 结构体
- apache环境下配置服务器支持https
- 在NVIDIA Jetson Xavier NX上把yolov4-deepsort的模型pb模型使用tensorflow-onnx和onnx-tensorrt工具最终转换为tensorrt模型
- 如何用java+tomcat来创建网站服务器
- 好用的工具网站!(缓慢收集中!)
- 输出NSRange类型的数据
- 【数字信号】基于matlab GUI手机拨号音效模拟【含Matlab源码 909期】
- 【Hoxton.SR1版本】Spring Cloud Bus消息总线
- SSM框架整合环境搭建
- 全志F1C100s使用记录:资料索引与基础说明
- 用树形算法思想去使用思维导图\树形图\鱼骨图
- 关于利用背景减除法的固定摄像头的移动侦测算法
- shiro 原理简介
- intel服务器芯片组C,Intel C232芯片组 华硕P10S-C售2399元
- 收到短信:【淘会员】加微信免费赠礼品!是什么套路?这类短信如何发
- Microsoft Compatibility Telemetry占用系统cpu
- Hadoop安全认证(2)
- 面试造火箭,秋招建大楼!阿里新出《Java权威面试指南》堪称精品!
- PIN, PIN2, PUK, PUK2
- php - 发送qq邮箱信息
热门文章
- 搜搜/soso、有道、搜狗/sogou、雅虎/Yahoo、url 参数分析
- 同轴线传输网络摄像机信号2KM
- 单片机-硬件接口(UART/IIC/SPI/RS232/USB/CAN)异同
- 电脑批量加入域控制器脚本
- Amy-Tabb机器人世界手眼标定(4、Windows)
- LOJ2758 年轮蛋糕
- RF MEMS开关时代将开启-30?
- hive 正则表达式-regexp
- 边缘检测:更丰富的卷积特征 Richer Convolutional Features for Edge Detection
- hadoop配置过程中可能会出的问题localhost: root@localhost: Permission denied (publickey,password).