参考文档:
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相关推荐

  1. java.util.concurrent.locks.Condition 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...

  2. java.util.concurrent.locks.Condition文档说明

    [1]Condition接口文档描述 1.Condition类把Object监视器方法(wait,nofify, notifyAll)分解为不同对象,通过与Lock实现类的合并使用,Condition ...

  3. java.util.concurrent.locks.Condition 例子程序探讨

    API文档上例子如下: class BoundedBuffer {    final Lock lock = new ReentrantLock(); 下面使用两个condition是否有必要?    ...

  4. Concurrent包工具类使用

    一.读写锁 传统的同步锁就是独占式锁,当线程使用资源时候保持独占,无论读写.当人们发现请求队列(假设)中相邻请求为读-读的时候,阻塞是一种浪费资源的操作.比如公告板,所有路过的人(请求)都是读操作,并 ...

  5. python两个线程交替打印_三线程按顺序交替打印ABC的四种方法

    建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 二.Synchroni ...

  6. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信

    为什么80%的码农都做不了架构师?>>>    Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...

  7. ZooKeeper系列(四)

    一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...

  8. 并发编程(四)---设计模式

    四.设计模式 4.0同步和异步: 同步异步 , 举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就 ...

  9. JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)

    JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...

  10. Java实验四,星号题最终版(暂定。。。也许还能找到问题)

    实验四 1. 第一版使用wait.notifyAll.synchronized ,可以买到票但是排序不行 2. 第二版 第一次使用公平锁.ReentrantLock.Condition,感觉还是没解决 ...

最新文章

  1. 只求规模不管服务?那平台就离死不远了
  2. 按摩加快肌肉修复有科学依据了,哈佛大学研究成果登Science子刊
  3. ielts speaking questions
  4. 数字信号处理学习笔记(四)|实现巴特沃斯型模拟低通滤波器
  5. 古老的spc也可以用机器学习(三)-支持向量机算法
  6. Edge浏览器网页怎么收藏 Edge浏览器网页收藏图文教程
  7. ElasticSearch原理
  8. 开机先看广告!智能电视这流氓操作被整治,这家厂商败诉
  9. 目标检测——对数据进行EDA分析的学习笔记
  10. 干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划
  11. apache poi处理表格示例
  12. 服务器,路由器,交换机产品解读
  13. 密码显示隐藏符号格式会变
  14. Manjaro 清理垃圾
  15. Mac无法打开CORE Keygen
  16. Dissect Certificate
  17. Hough直线检测的原理与实现
  18. autojs自定义Switch
  19. iOS 获取手机型号信息大全
  20. 为什么一场比赛进3球叫帽子戏法?

热门文章

  1. 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
  2. oracle中如何创建一个过程,如何开发ORACLE存储过程
  3. excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
  4. fiddler抓包工具简介
  5. uni map 实时记录轨迹_国际学校纷纷引进MAP考试系统,到底有什么好处?
  6. js svg 转成文件_如何缩小 SVG 文件的大小?去掉冗余的标签,压缩它的大小
  7. pytorch reshape_PyTorch中的contiguous
  8. python挂机脚本阴阳师_Python简单实现阴阳师挂机脚本
  9. 锁相环PLL/MMCM的使用
  10. 如何制作计算机启动盘,一款U盘启动盘制作小工具