concurrent(四)Condition
参考文档:
Java多线程系列--“JUC锁”06之 Condition条件:http://www.cnblogs.com/skywang12345/p/3496716.html
Condition介绍
Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的;而Condition是需要与"互斥锁"/"共享锁"捆绑使用的。基于Unsafe.park()/Unsafe.unpark()实现
Condition函数列表
// 造成当前线程在接到信号或被中断之前一直处于等待状态。 void await() // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 boolean await(long time, TimeUnit unit) // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 long awaitNanos(long nanosTimeout) // 造成当前线程在接到信号之前一直处于等待状态。 void awaitUninterruptibly() // 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。 boolean awaitUntil(Date deadline) // 唤醒一个等待线程。 void signal() // 唤醒所有等待线程。 void signalAll()
举个栗子-单条件
public class ConditionTest {private static Lock lock = new ReentrantLock();private static Condition condition = lock.newCondition();public static void main(String[] args) {ThreadA ta = new ThreadA("t");lock.lock(); // 获取锁try {System.out.println(Thread.currentThread().getName() + " start ta");ta.start();System.out.println(Thread.currentThread().getName() + " block");condition.await(); // 等待System.out.println(Thread.currentThread().getName() + " continue");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock(); // 释放锁 }}static class ThreadA extends Thread {public ThreadA(String name) {super(name);}public void run() {lock.lock(); // 获取锁try {try {Thread.sleep(1000*5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " wakup others");condition.signal(); // 唤醒“condition所在锁上的其它线程”} finally {lock.unlock(); // 释放锁 }}} }
View Code
举个栗子-多条件
/*** 生产者消费者模型。一个lock,两个condition,一个condition控制消费者,一个condition控制生产者* @author BFD_526**/ public class ConditionMoreTest {private static BoundedBuffer bb = new BoundedBuffer();public static void main(String[] args) {new PutThread("producer").start();new TakeThread("consumer").start();}static class PutThread extends Thread {public PutThread(String name) {super(name);}public void run() {while (true) {try {// 向BoundedBuffer中写入数据Random rd = new Random();bb.put(rd.nextInt(100));Thread.sleep(1000*2);} catch (InterruptedException e) {e.printStackTrace();}}}}static class TakeThread extends Thread {public TakeThread(String name) {super(name);}public void run() {while (true) {try {// 从BoundedBuffer中取出数据Integer num = (Integer) bb.take();//Thread.sleep(1000 * 3);} catch (InterruptedException e) {e.printStackTrace();}}}} }class BoundedBuffer {final Lock lock = new ReentrantLock();final Condition notFull = lock.newCondition();final Condition notEmpty = lock.newCondition();List<Integer> store = new ArrayList<Integer>();int limitSize=5;public void put(Integer x) throws InterruptedException {lock.lock(); // 获取锁System.out.println("put start size:"+store.size());try {// 如果“缓冲已满”,则等待;直到“缓冲”不是满的,才将x添加到缓冲中。while (store.size() == limitSize) {System.out.println("buffer full wait " + Thread.currentThread().getName());notFull.await();} // 将x添加到缓冲中 store.add(x);// 唤醒take线程,因为take线程通过notEmpty.await()等待 notEmpty.signal();System.out.println(Thread.currentThread().getName() + " put " + (Integer) x);} finally {lock.unlock(); // 释放锁 }}public Object take() throws InterruptedException {lock.lock(); // 获取锁System.out.println("take start size:"+store.size());try {// 如果“缓冲为空”,则等待;直到“缓冲”不为空,才将x从缓冲中取出。while (store.size() == 0)notEmpty.await();// 将x从缓冲中取出Object x = store.remove(0);// 唤醒put线程,因为put线程通过notFull.await()等待 notFull.signal();// 打印取出的数据System.out.println(Thread.currentThread().getName() + " take " + (Integer) x);return x;} finally {lock.unlock(); // 释放锁 }} }
View Code
转载于:https://www.cnblogs.com/amei0/p/9021823.html
concurrent(四)Condition相关推荐
- java.util.concurrent.locks.Condition 源码
2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...
- java.util.concurrent.locks.Condition文档说明
[1]Condition接口文档描述 1.Condition类把Object监视器方法(wait,nofify, notifyAll)分解为不同对象,通过与Lock实现类的合并使用,Condition ...
- java.util.concurrent.locks.Condition 例子程序探讨
API文档上例子如下: class BoundedBuffer { final Lock lock = new ReentrantLock(); 下面使用两个condition是否有必要? ...
- Concurrent包工具类使用
一.读写锁 传统的同步锁就是独占式锁,当线程使用资源时候保持独占,无论读写.当人们发现请求队列(假设)中相邻请求为读-读的时候,阻塞是一种浪费资源的操作.比如公告板,所有路过的人(请求)都是读操作,并 ...
- python两个线程交替打印_三线程按顺序交替打印ABC的四种方法
建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 二.Synchroni ...
- Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信
为什么80%的码农都做不了架构师?>>> Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...
- ZooKeeper系列(四)
一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...
- 并发编程(四)---设计模式
四.设计模式 4.0同步和异步: 同步异步 , 举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就 ...
- JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)
JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...
- Java实验四,星号题最终版(暂定。。。也许还能找到问题)
实验四 1. 第一版使用wait.notifyAll.synchronized ,可以买到票但是排序不行 2. 第二版 第一次使用公平锁.ReentrantLock.Condition,感觉还是没解决 ...
最新文章
- 只求规模不管服务?那平台就离死不远了
- 按摩加快肌肉修复有科学依据了,哈佛大学研究成果登Science子刊
- ielts speaking questions
- 数字信号处理学习笔记(四)|实现巴特沃斯型模拟低通滤波器
- 古老的spc也可以用机器学习(三)-支持向量机算法
- Edge浏览器网页怎么收藏 Edge浏览器网页收藏图文教程
- ElasticSearch原理
- 开机先看广告!智能电视这流氓操作被整治,这家厂商败诉
- 目标检测——对数据进行EDA分析的学习笔记
- 干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划
- apache poi处理表格示例
- 服务器,路由器,交换机产品解读
- 密码显示隐藏符号格式会变
- Manjaro 清理垃圾
- Mac无法打开CORE Keygen
- Dissect Certificate
- Hough直线检测的原理与实现
- autojs自定义Switch
- iOS 获取手机型号信息大全
- 为什么一场比赛进3球叫帽子戏法?
热门文章
- 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
- oracle中如何创建一个过程,如何开发ORACLE存储过程
- excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
- fiddler抓包工具简介
- uni map 实时记录轨迹_国际学校纷纷引进MAP考试系统,到底有什么好处?
- js svg 转成文件_如何缩小 SVG 文件的大小?去掉冗余的标签,压缩它的大小
- pytorch reshape_PyTorch中的contiguous
- python挂机脚本阴阳师_Python简单实现阴阳师挂机脚本
- 锁相环PLL/MMCM的使用
- 如何制作计算机启动盘,一款U盘启动盘制作小工具