使用Lock与ReentrantLock模拟消息队列阻塞,生产与消费问题模拟
来源:互联网 发布:大众奥迪编程 编辑:程序博客网 时间:2024/06/02 03:07
//测试结果package com.cn.test.queue;public class EggTest {/** * @param args */public static void main(String[] args) {//创建一个鸡蛋篮子,实现阻塞队列EggBlockingQueue eggs=new EggBlockingQueue();int n=0;PutEggThread put=null;PollEggThread poll=null;//创建10个放鸡蛋如篮子的线程while(n<10){put=new PutEggThread();put.setEggs(eggs);put.setEggsName(n);put.start();n++;}n=0;//创建10个拿鸡蛋的线程while(n<10){poll=new PollEggThread();poll.setEggs(eggs);poll.start();n++;}}}
package com.cn.test.queue;import java.util.ArrayDeque;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class EggBlockingQueue {//数组队列用来存放鸡蛋@SuppressWarnings("rawtypes")private ArrayDeque aq=new ArrayDeque();private ReentrantLock lock;private Condition notFull;private Condition notEmpty;public EggBlockingQueue(){lock=new ReentrantLock();notFull=lock.newCondition();notEmpty=lock.newCondition();}/** * 取出鸡蛋 * @return the eggname */public void pollEgg() {final ReentrantLock lock=this.lock;//获取锁lock.lock();try {if (aq.size()<=0) {System.out.println("鸡蛋已经拿完了,等待放入鸡蛋");}//当鸡蛋篮子为空的时候,当前线程进入等待队列while(aq.size()<=0){notFull.await();}System.out.println("从篮子里拿出来的鸡蛋是......"+(String)aq.poll());}catch (InterruptedException e1) {e1.printStackTrace();//唤醒等待线程队列里的线程notEmpty.signal();
}finally{//释放对象锁lock.unlock();}}/** * 放入鸡蛋 * @param eggname the eggname to set */public void addEgg(String eggname) {final ReentrantLock lock=this.lock;//获取锁try {lock.lockInterruptibly();//鸡蛋篮子容量只能放放5个//超出5个就进入等待状态while(aq.size()>=5){notEmpty.awaitNanos(500);}System.out.println("放入篮子里的鸡蛋是......"+eggname+"是否放入成功"+aq.add(eggname));}catch (InterruptedException e) {System.out.println("唤醒拿鸡蛋的线程........");//唤醒等待线程队列里的线程notFull.signal();
}finally{//释放对象锁lock.unlock();}}}package com.cn.test.queue;public class PollEggThread extends Thread {private EggBlockingQueue eggs;//private String eggName;public void setEggs(EggBlockingQueue args) {eggs=args;}/*public void setEggsName(int args){eggName="Eggs-"+args;}*/@Overridepublic void run() {eggs.pollEgg();}}package com.cn.test.queue;public class PutEggThread extends Thread {private EggBlockingQueue eggs;private String eggName;public void setEggs(EggBlockingQueue args) {eggs=args;}public void setEggsName(int args){eggName="Eggs-"+args;}@Overridepublic void run() {eggs.addEgg(eggName);}}弄完之后对线程有了一个更深的理解
阅读全文
0 0
- 使用Lock与ReentrantLock模拟消息队列阻塞,生产与消费问题模拟
- Java模拟生产消费问题
- ActiveMQ消息队列之java消息生产与消费
- AutoResetEvent来模拟实现生产消费问题
- ActiveMQ使用线程池实现消息的生产与消费
- ActiveMQ使用线程池实现消息的生产与消费 .
- ActiveMQ使用线程池实现消息的生产与消费
- ActiveMQ使用线程池实现消息的生产与消费
- ActiveMQ使用线程池实现消息的生产与消费
- SpringCloud Stream-----2、消息生产与消费
- Thread线程之 多生产者与多消费者模拟生产消费
- 阻塞队列实现--生产消费模型
- 堆栈与队列模拟
- Lock与ReentrantLock
- 多线程生产与消费
- synchronized/wait/notify 与 mutex/cond wait wake ~ 链表队列 生产消费问题
- 模拟阻塞队列-使用notify和wait
- 模拟消息队列
- C语言 指针例解
- 线性表——链式存储结构之循环双链表
- Tiny4412 Android5.0 定制键值相关的文件
- 动态规划——编辑距离
- 竖式问题
- 使用Lock与ReentrantLock模拟消息队列阻塞,生产与消费问题模拟
- java中集合List用法
- elasticsearch条件查询语句与聚合查询语句模板
- 【算法-简单数学问题】- 素数表的获取(简单方法和埃式筛法)
- 堆排序
- Android入门学习:GUI中的常用控件
- CSS简介:初识CSS
- 导入项目时,将java工程转变成web工程
- 盒模型