网上有很多生产者消费者模型,很多都是基于synchronized, wait, notify的,也有基于Lock的,下面是我用Lock, Condition实现的.
1 仓库:
class GodOwn { //声明锁对象 private Lock lock = new ReentrantLock(); //当仓库中的物品数量不够消费的条件 Condition lessCondition = lock.newCondition(); //当仓库中的物品数量超过仓库的总量的条件 Condition moreCondition = lock.newCondition(); private final int max_size = 50; private int baseNum = 0; int getMax_size() { return max_size; } int getBaseNum() { return baseNum; } void setBaseNum(int baseNum) { this.baseNum = baseNum; } public void produce (int neednum) { lock.lock(); try { while (this.getBaseNum() + neednum > this.getMax_size()) {//超过总量不生产 try { moreCondition.await();//超过仓库总量时,生产线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setBaseNum(this.getBaseNum() + neednum); System.out.println("生产了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!"); moreCondition.signalAll();//本轮生产完毕,唤醒对象上所有的线程,看是否需要生产还是消费 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock();//释放锁,这一步很重要,最好在finally语句块里执行,防止程序异常,锁永远无法释放 } } public void reduce(int neednum) { lock.lock(); try { while (this.getBaseNum() - neednum < 0) { try { lessCondition.await();//仓库总量不够本次消费数量时,消费线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setBaseNum(this.getBaseNum() - neednum); System.out.println("消费了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!"); lessCondition.signalAll();//本轮消费完毕,唤醒对象上所有的线程,看是否需要生产还是消费 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock();//释放锁 } } }
2 生产者模型
class ProduceThread extends Thread { private GodOwn godOwn; private int neednum; ProduceThread(GodOwn godOwn, int neednum) { this.godOwn = godOwn; this.neednum = neednum; } public void run() { godOwn.produce(neednum); } }
3 消费者模型
class ResuseThread extends Thread { private GodOwn godOwn; private int neednum; ResuseThread(GodOwn godOwn, int neednum) { this.godOwn = godOwn; this.neednum = neednum; } public void run () { this.godOwn.reduce(neednum); } }
4 测试代码
public static void main(String[] args) { GodOwn godOwn = new GodOwn(); ProduceThread p1 = new ProduceThread(godOwn, 50); ProduceThread p2 = new ProduceThread(godOwn, 30); ProduceThread p3 = new ProduceThread(godOwn, 20); ProduceThread p4 = new ProduceThread(godOwn, 20); ProduceThread p5 = new ProduceThread(godOwn, 20); ResuseThread r1 = new ResuseThread(godOwn, 20); ResuseThread r2 = new ResuseThread(godOwn, 20); ResuseThread r3 = new ResuseThread(godOwn, 20); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); r1.start(); r2.start(); r3.start(); }
运行结果:
生产了50个,仓库共有50个! 消费了20个,仓库共有30个! 生产了20个,仓库共有50个! 消费了20个,仓库共有30个! 消费了20个,仓库共有10个! 生产了20个,仓库共有30个! 生产了20个,仓库共有50个!
以上只是一个简单的例子,为了说明Lock Condition的用处!
相关推荐
通过java语言编写的生产者消费者,实现方法为lock类和condition类的配合完成。
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
主要介绍了Lock、Condition实现简单的生产者消费者模式示例,需要的朋友可以参考下
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
比较实用,是操作系统很好的教辅资料。很详细的讲解。
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象... 多对多 生产者/消费者
本文实例讲述了python条件变量之生产者与消费者操作。分享给大家供大家参考,具体如下: 互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Python还提供了Condition对象。Condition被称为条件变量,除了提供与...
尚硅谷_JUC线程高级_生产者消费者案例-虚假唤醒 ·9. 尚硅谷_JUC线程高级_Condition 线程通信 ·10. 尚硅谷_JUC线程高级_线程按序交替 ·11. 尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_...
**②同步机制实现**:基于unique_lock以及condition_variable实现同步和互斥,符合RAII原则;\ **5)简单客户端**:(可以通过浏览器进行服务端访问,也可以通过该客户端实现交互以及非活动连接处理的测试)\ **...
通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized ...27.一篇文章,让你彻底弄懂生产者--消费者问题
Java线程指南 线程安全与不安全 线程同步synchronized和volatile 线程协作-生产者/消费者模式 Timer和TimerTask 线程池 Callable和Future 锁对象Lock-同步问题更完美的处理方式 Condition-线程通信更高效的方式
第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...
第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...
第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...
第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...
高并发编程第三阶段30讲 使用Condition实现一个多线程下的Producer-Consumer_.mp4 高并发编程第三阶段31讲 JDK8-StampedLock详细介绍-上_.mp4 高并发编程第三阶段32讲 JDK8-StampedLock详细介绍-下.mp4 高...
高并发编程第三阶段30讲 使用Condition实现一个多线程下的Producer-Consumer_.mp4 高并发编程第三阶段31讲 JDK8-StampedLock详细介绍-上_.mp4 高并发编程第三阶段32讲 JDK8-StampedLock详细介绍-下.mp4 高...