Condition实现生产者消费者模式(等待/通知机制)
来源:互联网 发布:pps总显示网络不给力 编辑:程序博客网 时间:2024/04/29 05:40
我在前面的博客中写过一个生产者消费者的实现方法,只不过那篇文章用的是Object类的wait()和notify()、notifyAll().配以synchronized实现的。这篇文章将会用Reentrantlock进行同步,用condition的await()和signal、signalAll()实现等待、通知机制。
需要注意的是:
condition.await();调用后会立即失去锁,condition1.signalAll();调用后不会立即失去锁,会等待线程执行完同步(lock.lock()和lock.unlock();包围的代码)代码后失去锁。并唤醒所有(condition1.signal()只会唤醒一个)由该condition调用await()方法导致阻塞的线程。
另外 condition1.signal 和 condition1.signalAll();、condition1.signal();的调用必须保证当前线程正在持有锁,即他们必须在同步代码块中被调用。否则将会出错。
1 新建一个service类
public class MyService {private ReentrantLock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();//一个lock可以新建多个Condition(对象监视器) 线程对象可以注册到指定的condition中//private Condition condition2 = lock.newCondition();private boolean flag = true;//MethodA是否可以运行 true表示可运行public void MethodA(){lock.lock();if(!flag){try {condition1.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("生产者正在执行");this.flag = false;condition1.signalAll();lock.unlock();}public void MethodB(){lock.lock();if(flag){try {condition1.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("消费者正在执行");this.flag = true;condition1.signalAll();lock.unlock();}}
2 新建一个测试类
public class Test {public static void main(String[] args) {MyService myService = new MyService();Runnable runnableA = new Runnable() {@Overridepublic void run() {for(int i =0;i<10;i++){myService.MethodA();}}};Runnable runnableB = new Runnable() {@Overridepublic void run() {for(int i =0;i<10;i++){myService.MethodB();}}};Thread threadA = new Thread(runnableA);Thread threadB = new Thread(runnableB);threadB.start();threadA.start();}}
运行结果:
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
生产者正在执行
消费者正在执行
阅读全文
0 0
- Condition实现生产者消费者模式(等待/通知机制)
- 生产者和消费者问题【java等待通知机制实现】
- Java等待/通知机制:生产者-消费者问题
- 生产者消费者模式——线程并发(通知、等待)
- 再谈AbstractQueuedSynchronizer2:共享模式与基于Condition的等待/通知机制实现
- 用Condition条件变量实现生产者消费者模式
- 多线程_生产者消费者之等待唤醒机制代码实现
- 使用Condition的生产者消费者模式
- 使用 Lock 与Condition 实现生产者消费者
- 使用lock&condition实现生产者消费者
- Chapter 6 生产者消费者之Condition实现
- 使用Lock的Condition实现生产者消费者
- 利用Condition实现生产者和消费者资源共享
- python使用threading.condition实现生产者消费者
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- 生产者消费者模式实现
- 生产者消费者模式实现
- 实现生产者-消费者模式
- Mybatis学习总结(一)---快速入门
- TIP-Localizing Region-Based Active Contours(2008)阅读笔记
- Ubuntu16.04重装grub
- Ubuntu 安装php
- SpringMVC异常处理
- Condition实现生产者消费者模式(等待/通知机制)
- Python 操作 redis
- 1332:幂的末尾
- android looper 机制
- 阿里云服务优惠券免费领取
- Java学习体系
- Qt5.9.1+Opencv3.3的环境配置
- 新手是没有创新能力的,你所谓的创新是你的知识面窄。
- POJ2955 Brackets(区间DP,括号匹配)