java condition条件队列 生产者消费模式
来源:互联网 发布:java微信自定义菜单 编辑:程序博客网 时间:2024/04/28 11:40
/** * Date:2016年9月7日下午7:56:03 * Copyright (c) 2016, www.bwbroad.com All Rights Reserved. * */package test.condition;import java.util.LinkedList;import java.util.Queue;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Description: TODO <br/> * Date: 2016年9月7日 下午7:56:03 <br/> * * @author xuejianxin */public class ConditionTest1 {public static int CHUSHI = 6;public static int CHIHUO = 10;public static void main(String[] args) throws Exception {/** 这就是多个Condition的强大之处,假设缓存队列中已经存满,那么阻塞的肯定是写线程, 唤醒的肯定是读线程,相反,阻塞的肯定是读线程,唤醒的肯定是写线程,那么假设只有一个Condition会有什么效果呢, 缓存队列中已经存满,这个Lock不知道唤醒的是读线程还是写线程了,如果唤醒的是读线程, 皆大欢喜,如果唤醒的是写线程,那么线程刚被唤醒,又被阻塞了,这时又去唤醒,这样就浪费了很多时间。 */System.out.println(new Random().nextInt(10));Panzi panzi = new Panzi(2);Chushi chushi = new Chushi("厨师", panzi);chushi.start();// Chushi chushi1 = new Chushi("厨师1", panzi);// chushi1.start();Chihuo chihuo1 = new Chihuo("吃货1", panzi);Chihuo chihuo2 = new Chihuo("吃货2", panzi);chihuo1.start();chihuo2.start();}public static class Panzi {private int count = 0;private Queue<String> foods;private Lock lock = new ReentrantLock();private Condition chushiCon = lock.newCondition();//厨师等待的条件private Condition chihuoCon = lock.newCondition();//吃货等待的条件public Panzi(int count) {this.count = count;foods = new LinkedList<String>();}public/* synchronized */void put(String name, String food) {lock.lock();try {while (foods.size() >= count) {// 这里必须用循环System.out.printf("%d/%d,%s 快吃啊...........................\r\n",foods.size(), this.count, name);try {// this.wait();chushiCon.await();// 厨师等待} catch (InterruptedException e) {e.printStackTrace();}}foods.offer(food);System.out.printf("%d/%d,%s----->%s\r\n", foods.size(),this.count, name, food);// this.notifyAll();chihuoCon.signalAll();// 唤醒吃货} finally {lock.unlock();//一定要在 finally 里释放锁}}public/* synchronized */String get(String name) {lock.lock();try {while (foods.size() == 0) {// 这里必须用循环System.out.printf("%d/%d,%s 我等待花儿都谢了...\r\n", foods.size(),this.count, name);try {// this.wait();chihuoCon.await();// 吃货等待} catch (InterruptedException e) {e.printStackTrace();}}String food = foods.poll();System.out.printf("%d/%d,%s******>%s\r\n", foods.size(),this.count, name, food);// this.notifyAll();chushiCon.signalAll();//唤醒厨师return food;} finally {lock.unlock();}}}// 厨师类public static class Chushi extends Thread {private Panzi panzi;private String name;public Chushi(String name, Panzi panzi) {this.name = name;this.panzi = panzi;}@Overridepublic void run() {int i = 1;String s;while (true) {s = "food" + (i++);panzi.put(this.name, s);i++;try {Thread.sleep(new Random().nextInt(CHUSHI) * 100);} catch (InterruptedException e) {e.printStackTrace();}}}}// 吃货类public static class Chihuo extends Thread {private String name;private Panzi panzi;public Chihuo(String name, Panzi panzi) {this.name = name;this.panzi = panzi;}@Overridepublic void run() {while (true) {panzi.get(this.name);try {Thread.sleep(new Random().nextInt(CHIHUO) * 100);} catch (InterruptedException e) {e.printStackTrace();}}}}}
0 0
- java condition条件队列 生产者消费模式
- Java并行编程-lock中使用多条件condition(生产者消费者模式实例)
- 用Condition条件变量实现生产者消费者模式
- java wait/notify 生产者消费模式
- java多线程--condition条件
- Lock和Condition实现阻塞队列与生产者消费者模式的实现
- Java 队列 实现生产者-消费者模式
- 使用Condition的生产者消费者模式
- JAVA并发处理经验(四)并行模式与算法1:生产者消费与单例模式
- Java多线程系列--Condition条件
- Java条件对象(Condition)
- java线程协作,经典生产者/消费者模式(二、Lock和Condition)
- Java Thread&Concurrency(14): 深入理解条件队列(Condition)及其实现原理
- 【Java多线程】-Condition使用(生产者-消费者)
- 使用java Condition构建生产者消费者
- JAVA十个线程消费一个生产者
- java中自动实现生产者消费者模式的队列
- Java生产者-消费者模式的非阻塞队列实现
- Reversing Linked List
- Baxter学习笔记3-示教演练篇
- 几个关于父元素、子元素的常用的js选择器
- 大数据研发(一)Hadoop平台搭建
- c++ primer plus 学习笔记(1)——复制构造函数与赋值运算符
- java condition条件队列 生产者消费模式
- 根据java内存模型理解并发出现的问题
- shh框架返回json数据给前台
- jquery若本地文件引用库文件有问题时,可以使用在线的地址调试效果
- Tomcat遇到OracleTimeoutPollingThread错误
- 协同过滤中item-based与user-based选择依据
- Python基础-用多个字符分割字符串
- 计算广告-在线广告的产品概况
- 最大奇约数