使用ReentrantLock和Condition实现生产者消费者模型
来源:互联网 发布:linux apache压力测试 编辑:程序博客网 时间:2024/05/17 10:43
使用ReentrantLock和Condition实现【生产者-消费者】。
/** * @author wzx * @time 2017/5/8 */public class ProducerConsumerSolutionUsingLock { public static void main(String[] args) throws InterruptedException { ProducerConsumerImpl producerConsumer = new ProducerConsumerImpl(); Thread producer = new Thread(new Producer(producerConsumer)); Thread producer2 = new Thread(new Producer(producerConsumer)); Thread producer3 = new Thread(new Producer(producerConsumer)); Thread consumer = new Thread(new Consumer(producerConsumer)); Thread consumer2 = new Thread(new Consumer(producerConsumer)); producer.start(); producer2.start(); producer3.start(); consumer.start(); consumer2.start(); TimeUnit.SECONDS.sleep(3); } static class ProducerConsumerImpl { private static final int CAPACITY = 10; private final Queue<Integer> queue = new LinkedList(); private final Random theRandom = new Random(); private final ReentrantLock lock = new ReentrantLock(); private final Condition bufferNotFull = lock.newCondition(); private final Condition bufferNotEmpty = lock.newCondition(); public void put() throws InterruptedException { lock.lock(); try { while (true) { while (queue.size() == CAPACITY) { System.out.println("Buffer is full, waiting"); bufferNotEmpty.await(); } int num = theRandom.nextInt(); boolean isAdded = queue.offer(num); System.out.println("added " + num + " into queue"); if (isAdded) { bufferNotFull.signalAll(); } } } finally { lock.unlock(); } } public void get() throws InterruptedException { lock.lock(); try { while (true) { while (queue.size() == 0) { System.out.println("Buffer is empty, waiting"); bufferNotFull.await(); } Integer num = queue.poll(); if (num != null) { System.out.println("consumed " + num + " from queue"); bufferNotEmpty.signalAll(); } } } finally { lock.unlock(); } } } static class Producer implements Runnable { private ProducerConsumerImpl producerConsumer; public Producer(ProducerConsumerImpl producerConsumer) { this.producerConsumer = producerConsumer; } @Override public void run() { try { producerConsumer.put(); } catch (InterruptedException e) { e.printStackTrace(); } } } static class Consumer implements Runnable { private ProducerConsumerImpl producerConsumer; public Consumer(ProducerConsumerImpl producerConsumer) { this.producerConsumer = producerConsumer; } @Override public void run() { try { producerConsumer.get(); } catch (InterruptedException e) { e.printStackTrace(); } } }}
执行结果:
added 1892544024 into queueadded -444311193 into queueadded 1942706941 into queueadded -258892878 into queueadded -1318716428 into queueadded 1574586774 into queueadded 1202469039 into queueadded 432139815 into queueadded 283938192 into queueBuffer is full, waitingBuffer is full, waitingBuffer is full, waitingconsumed -1898407557 from queueconsumed 1892544024 from queueconsumed -444311193 from queueconsumed 1942706941 from queueconsumed -258892878 from queueconsumed -1318716428 from queueconsumed 1574586774 from queueconsumed 1202469039 from queueconsumed 432139815 from queueconsumed 283938192 from queueBuffer is empty, waitingBuffer is empty, waiting
参考
http://javarevisited.blogspot.com/2015/06/java-lock-and-condition-example-producer-consumer.html#axzz4gOjkc8Yu
0 0
- 使用ReentrantLock和Condition实现生产者消费者模型
- 使用Lock和Condition实现生产者消费者模型
- 生产者消费者模型(多个生产者和多个消费者)JDK1.5 (Lock&Condition)实现版
- 再提生产者消费者,引入Condition和ReentrantLock
- 使用Lock和Condition实现生产者和消费者
- 使用ReentrantLock实现生产者消费者模式
- 使用BlockingQueue实现生产者和消费者模型
- synchronized和ReentrantLock实现消费者生产者问题
- 使用 Lock 与Condition 实现生产者消费者
- 使用lock&condition实现生产者消费者
- 使用Lock的Condition实现生产者消费者
- python使用threading.condition实现生产者消费者
- 利用Condition实现生产者和消费者资源共享
- 生产者消费者模型(使用lock.condition进行分组唤醒)
- 使用wait和notifyAll实现生产者消费者模型
- 使用ReentrantLock模拟简单生产者和消费者问题
- 生产者-消费者模式 系列 之二 ReentrantLock, Condition 篇
- java中重入ReentrantLock(Condition监视器)锁生产者消费者
- 南洋oj 题目144小珂的苦恼
- 自定义EasyUI的datetimebox控件日期时间的显示格式
- POJ,3177 Redundant Paths
- kubernetes环境搭建
- Android与Linux的区别
- 使用ReentrantLock和Condition实现生产者消费者模型
- Android中两个Activity之间数据传递及返回
- 最长回文子串
- java 并发安全的思考
- hdu 1241 Oil Deposits (dfs经典入门)
- oracle插入数据报ORA-00001:违反唯一约束条件
- 练习 2-3 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀 0x 或 0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f 以及 A~F。
- Struts2框架详细用法第一课
- shell脚本定时重启tomcat