利用J.U.C中的lock和condition实现生产者消费者模式
package lockTest; import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class ConditionTest { private Lock lock; private LinkedList<String> buffer; private int maxSize; private Condition notfullCondition; private Condition fullCondition; public ConditionTest(int maxSize) {
this.maxSize = maxSize;
lock = new ReentrantLock();
buffer = new LinkedList<>();
this.maxSize = maxSize;
notfullCondition = lock.newCondition();
fullCondition = lock.newCondition();
} public void produce(String goods) throws InterruptedException { lock.lock(); try { while (maxSize == buffer.size()) {
notfullCondition.await();
System.out.println("工厂产能达到极限,不能继续进行生产了,停工一段时间");
} //队列没有满,可以生产
buffer.add(goods); System.out.println("哈哈,我生产了" + goods + ",通知消费者进行消费...");
//通知消费者线程进行消费
fullCondition.signalAll(); } finally {
lock.unlock();
}
} public String consume() throws InterruptedException { String goods = null;
lock.lock(); try { while (buffer.size() == 0) {
System.out.println("工厂的产品已经消费完了,暂时不能剁手了");
fullCondition.await();
} //开始消费
goods = buffer.poll();
System.out.println("哈哈,我消费" + goods + ",通知工厂进行生产...");
//通知生成者
notfullCondition.signalAll(); } finally {
lock.unlock();
} return goods;
} public static void main(String[] args) { ConditionTest conditionTest = new ConditionTest(100); new Thread(() -> { for (int i = 0; i < 1000000; i++) {
try {
conditionTest.produce("笔记本电脑" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }, "produce").start(); new Thread(() -> { while (true) {
try {
conditionTest.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }, "consume").start(); } }
利用J.U.C中的lock和condition实现生产者消费者模式的更多相关文章
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- 使用Lock锁生产者消费者模式
package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...
- 生产者消费者模式--阻塞队列--LOCK,Condition--线程池
1.阻塞队列:http://www.cnblogs.com/dolphin0520/p/3932906.html 2.Condition 生产者消费者实现 :http://www.cnblogs.co ...
- 生产者消费者模式中条件判断是使用while而不是if
永远在循环(loop)里调用 wait 和 notify,不是在 If 语句现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你 ...
- java——利用生产者消费者模式思想实现简易版handler机制
参考教程:http://www.sohu.com/a/237792762_659256 首先说一下这里面涉及到的线程: 1.mainLooper: 这个线程可以理解为消费者线程,里面运行了一个死循环, ...
- Java中为什么notify()可能导致死锁,而notifyAll()则不会(针对生产者-消费者模式)
1.先说两个概念:锁池 和 等待池 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线 ...
- 关于java中生产者消费者模式的理解
在说生产者消费者模式之前,我觉得有必要理解一下 Obj.wait(),与Obj.notify()方法.wait()方法是指在持有对象锁的线程调用此方法时,会释放对象锁,同时休眠本线程.notify() ...
随机推荐
- 【Python】【demo实验22】【练习实例】【猴子吃桃问题】
原题: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只 ...
- 脚本(bat、shell)调用conda
官网说明:https://docs.conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#using-conda-in-w ...
- 树莓派和STM32通过USB和串口通信记录
不管怎样,为了简便开发,通信选择串口通信. 推荐文章:https://blog.csdn.net/magnetoooo/article/details/53564797 推荐测试工具:https:// ...
- iframe父子页面通信
一.同域下父子页面的通信 1.父页面调用子iframe页面 (1)通过iframe的Id获取子页面的dom,然后通过内置属性contentWindow取得子窗口的window对象,此方法兼容各个浏览器 ...
- dev chart使用
public class LineChartHelp { #region 折线图 /// <summary> /// 创建折线图 /// </summary> public v ...
- PMP - 风险识别之风险登记册
目录 PMP - 风险识别之风险登记册 1. 风险登记册 1.1 已识别风险的清单 1.2 潜在风险责任人 1.3 潜在风险应对措施清单 2. 相关习题 2.1 风险发生的时候,要实施 风险登记册 上 ...
- python3.3.2中的关键字(转)
The following identifiers are used as reserved words, or keywords of the language, and cannot be use ...
- centos7安装配置NFS文件共享存储
一,环境介绍 本实验使用了两台centos7虚拟机,其中 服务器:192.168.1.188 客户端:192.168.1.189 二,实验步骤 192.168.1.1 ...
- hive用户自定义函数
一.UDF 1.显示所有函数:show functions ; 2.显示指定函数的帮助:$hive>desc function current_database(); 3. 什么是 UDF? 当 ...
- js小功能3:一个简单的计算器功能
html: <input type='text' id='txt1' /> <select id='select'> <option value='+'>+< ...