1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. public class Res {
  4. public String userSex;
  5. public String userName;
  6. public boolean flag = false;
  7. Lock lock = new ReentrantLock();
  8. }

  1. import java.util.concurrent.locks.Condition;
  2. public class IntTread extends Thread{
  3. private Res res;
  4. Condition condition;
  5. public IntTread(Res res, Condition condition) {
  6. this.res = res;
  7. this.condition = condition;
  8. }
  9. @Override
  10. public void run() {
  11. int count = 0;
  12. while (true){
  13. try {
  14. res.lock.lock();
  15. if (res.flag){
  16. try {
  17. condition.await();
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. if (count==0){
  23. res.userName = "男zs";
  24. res.userSex = "男";
  25. }else {
  26. res.userName = "女xh";
  27. res.userSex = "女";
  28. }
  29. count = (count + 1)%2;
  30. res.flag = true;
  31. condition.signal();
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. } finally {
  35. res.lock.unlock();
  36. }
  37. }
  38. }
  39. }

  1. import java.util.concurrent.locks.Condition;
  2. public class OutThread extends Thread {
  3. private Res res;
  4. private Condition condition;
  5. public OutThread(Res res, Condition condition) {
  6. this.res = res;
  7. this.condition = condition;
  8. }
  9. @Override
  10. public void run() {
  11. while (true){
  12. try {
  13. res.lock.lock();
  14. if (!res.flag){
  15. try {
  16. condition.await();
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. System.out.println(res.userName + "--" + res.userSex);
  22. res.flag = false;
  23. condition.signal();
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. } finally {
  27. res.lock.unlock();
  28. }
  29. }
  30. }
  31. }

  1. import java.util.concurrent.locks.Condition;
  2. /**
  3. * Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能
  4. * condition await() signal()
  5. */
  6. public class Main {
  7. public static void main(String[] args){
  8. Res res = new Res();
  9. Condition condition = res.lock.newCondition();
  10. IntTread intTread = new IntTread(res,condition);
  11. OutThread outThread = new OutThread(res,condition);
  12. intTread.start();
  13. outThread.start();
  14. }
  15. }

  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. /**
  4. * 与重入锁相关联的Condition
  5. * 和Object.wait(),notify()方法一样,当 线程使用Condition.await()时,要求线程持有相关的重入锁,
  6. * 在Condition.await()调用后,这个线程会释放这把锁。同理,在condition.signal()方法调用时,也要求
  7. * 线程先获得相关的锁,在condition.signal()方法调用后,系统会从当前Condition对象的等待队列中唤醒一个线程,
  8. * 一旦线程被唤醒,它会重新尝试获得与之绑定的重入锁,一旦成功获取,就可以继续执行了。因此,在signal()方法调用之后,
  9. * 一般需要释放相关的锁,让给被唤醒的线程,让它继续执行。
  10. */
  11. public class ConditionDemo implements Runnable{
  12. public static ReentrantLock lock = new ReentrantLock();
  13. public static Condition condition = lock.newCondition();
  14. @Override
  15. public void run() {
  16. try {
  17. lock.lock();
  18. condition.await();//使当前线程等待,同时释放当前锁
  19. System.out.println("Thread is going on");
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }finally {
  23. lock.unlock();
  24. }
  25. }
  26. public static void main(String[] args) throws InterruptedException{
  27. ConditionDemo t = new ConditionDemo();
  28. Thread t1 = new Thread(t);
  29. t1.start();
  30. Thread.sleep(2000);
  31. //通知线程t1继续执行
  32. lock.lock();//调用signal()的方法时,线程要先获得相关的锁
  33. condition.signal();//唤醒一个在等待中的线程
  34. lock.unlock();//signal()调用后释放相关的锁给被唤醒的线程
  35. }
  36. }

20_1.Condition的更多相关文章

  1. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  2. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...

  3. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  4. 1229【MySQL】性能优化之 Index Condition Pushdown

    转自http://blog.itpub.net/22664653/viewspace-1210844/  [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...

  5. 四、线程同步之Lock和Condition

    Lock同步锁 Lock 在jdk1.5  提供了Lock以便执行同步操作,和synchronized不同的是Lock提供了显示的方法获取锁和释放锁.Lock提供了以下几个方法,请求和释放锁: voi ...

  6. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  7. druid sql黑名单 报异常 sql injection violation, part alway true condition not allow

    最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助, 但是最近发现里面 有条sql语句 被拦截了, ...

  8. 【Java并发编程实战】-----“J.U.C”:Condition

    在看Condition之前,我们先来看下面这个例子: 工厂类,用来存放.取出商品: public class Depot { private int depotSize; //仓库大小 private ...

  9. 【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列

    package cn.study.concurrency.ch14; import java.util.concurrent.locks.Condition; import java.util.con ...

随机推荐

  1. Codeforces 845D - Two TVs(贪心)

    原题链接:http://codeforces.com/problemset/problem/845/D 题意:一个人在驾照考试中,路边有“限速XX”.“没有限速”.“可以超车”.“不能超车”路牌, 以 ...

  2. PHP Timer 页面运行时间监测类

    转至:http://blog.csdn.net/fdipzone/article/details/20160567 php Timer 页面运行时间监测类,可按不同key监测不同的运行时间 Timer ...

  3. SQL语句中 (+) 含义

    (+) 表示外连接.条件关联时,一般只列出表中满足连接条件的数据.如果条件的一边出现(+),则可列出该表中在条件另一侧的数据为空的那些记录.比如两个表:员工表和工资表.员工表中有总经理.A.B.C四条 ...

  4. Elven Postman

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  5. 定时任务cron表达式解析

    cron表达式2种: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth M ...

  6. Apache启动报错:Invalid command 'AuthType', perhaps misspelled or defined by a module not included in it

    在apache配置文件里面加了AuthType PFApacheAgent,,结果重启apache的时候歇菜了,,总是报上面的错, <Directory />AllowOverride n ...

  7. elementUI 弹出框添加可自定义拖拽和拉伸功能,并处理边界问题

    开发完后台管理系统的弹出框模块,被添加拖拽和拉伸功能,看了很多网上成熟的帖子引到项目里总有一点问题,下面是根据自己的需求实现的步骤: 首先在vue项目中创建一个js文件eg:dialog.js imp ...

  8. Gradient Descent with Momentum and Nesterov Momentum

    在Batch Gradient Descent及Mini-batch Gradient Descent, Stochastic Gradient Descent(SGD)算法中,每一步优化相对于之前的 ...

  9. 协程分析之context上下文切换

    协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持. 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, bo ...

  10. Java中的I/O

    1.Java中的I/O分类 I/O分类: 输入流,输出流,或者字节流,字符流 I/O中的四个抽象基类: InputStream,OutputStream:两者属于字节流,前者输入,后者输出.一般后缀名 ...