在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondition()返回中可以指定指定的线程释放和等待资源。

请看【唤醒全部线程】实例:

  1. package TestThread.TestCondition;
  2.  
  3. import java.util.concurrent.locks.ReentrantLock;
  4. import java.util.concurrent.locks.*;
  5.  
  6. public class TestCondition {
  7. public static void main(String[] args) {
  8. ReentrantLock lock = new ReentrantLock();
  9. Condition condition = lock.newCondition();
  10. Test1 th1 = new Test1(lock, condition, "线程1");
  11. Test1 th2 = new Test1(lock, condition, "线程2");
  12. Test1 th3 = new Test1(lock, condition, "线程3");
  13. Test2 t2 = new Test2(condition, lock, "我是唤醒线程");
  14. th1.start();
  15. th2.start();
  16. th3.start();
  17. try {
  18. Thread.sleep();
  19. t2.start();
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25.  
  26. class Test1 extends Thread {
  27. private ReentrantLock lock;
  28. private Condition condition1;
  29.  
  30. public Test1(ReentrantLock lock, Condition condition1, String name) {
  31. super(name);
  32. this.lock = lock;
  33. this.condition1 = condition1;
  34. }
  35.  
  36. @Override
  37. public void run() {
  38. for (int i = ; i < ; i++) {
  39. try {
  40. lock.lock();// 加锁
  41. if (i == ) {
  42. try {
  43. condition1.await();
  44. System.out.println(Thread.currentThread().getName() + "当前线程获取到的值为:++++++++++++" + i);
  45. } catch (InterruptedException e) {
  46. System.out.println(Thread.currentThread().getName() + ":线程被中断了!");
  47. }
  48. } else {
  49. System.out.println(Thread.currentThread().getName() + ":当前线程获取到的值为===》" + i);
  50. }
  51. } catch (Exception e) {
  52. System.out.println("系统发生异常!");
  53. } finally {
  54. lock.unlock();// 解锁
  55. }
  56. }
  57. }
  58. }
  59.  
  60. class Test2 extends Thread {
  61. private Condition condition;
  62. public ReentrantLock lock;
  63.  
  64. /**
  65. * @param condition协作对象
  66. * @param lock锁对象
  67. * @param name线程名称
  68. */
  69. public Test2(Condition condition, ReentrantLock lock, String name) {
  70. super(name);
  71. this.condition = condition;
  72. this.lock = lock;
  73. }
  74.  
  75. @Override
  76. public void run() {
  77. try {
  78. lock.lock();// 加锁
  79. condition.signalAll();;// 唤醒启动全部线程
  80. System.out.println(Thread.currentThread().getName() + ":已经唤醒了一个线程!");
  81. } catch (Exception e) {
  82. System.out.println(Thread.currentThread().getName() + ":线程挂了!");
  83. } finally {
  84. lock.unlock();// 解锁
  85. }
  86. }
  87. }
  88.  
  89. 测试结果:

  1.  

在Java的Condition接口【唤醒全部线程】的更多相关文章

  1. Java并发Condition接口

    java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力,直到给定的条件为真. Condition对象必须绑定到Lock,并使用newCondition( ...

  2. Java的LockSupport工具,Condition接口和ConditionObject

    在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...

  3. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  4. Java之多线程开发时多条件Condition接口的使用

    转:http://blog.csdn.net/a352193394/article/details/39454157 我们在多线程开发中,可能会出现这种情况.就是一个线程需要另外一个线程满足某某条件才 ...

  5. Java并发编程(十三)线程间协作的两种方式:wait、notify、notifyAll和Condition

    在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果 ...

  6. java多线程 -- Condition 控制线程通信

    Api文档如此定义: Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对 ...

  7. Java 并发编程之 Condition 接口

    本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...

  8. (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁

    8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...

  9. java中的锁之Lock接口与Condition接口

    一.Lock源码. 1.是一个接口.一共有6个方法. 2.方法详细如下: (1)当前线程尝试获取锁.结果分两种情况,一是成功获取到锁,则返回:二是获取锁失败,则一直等待.不响应中断请求. (2)当前线 ...

随机推荐

  1. 快乐!ajax入门(1)

    今天试着默写ajax时出现了神秘的问题,出现如图所示的错误: 百度了一下,说是跨源问题,我以为放在同一个文件夹不也是同源嘛!结果打扰了,属实是弟弟,协议,域名,端口相同的算同源,其他的不是!!! 最后 ...

  2. sqlserver2008R2 全日志恢复 实例操作

    --创建数据库create database test;--将数据库日志备份模式设置为全日志ALTER DATABASE test SET RECOVERY FULL ; --查询.确认数据库日志备份 ...

  3. 属性控件CMFCPropertyGridCtrl简单用法

    这是我的原创! 用一堆的编辑框下拉框做配置界面,很是繁琐,还要对齐排版……用这个属性控件 CMFCPropertyGridCtrl 就可以统一风格了. //初始化 CMFCPropertyGridCt ...

  4. TinkPHP框架学习-02控制器基本操作

        1-----创建控制器     2-----访问视图页面 3-----注册变量到视图页面 4-----获取表单数据 一 在Home模块下创建控制器 举例: 目录tp/Application/H ...

  5. 超详细的遗传算法(Genetic Algorithm)解析

    https://blog.csdn.net/u010451580/article/details/51178225 https://www.jianshu.com/p/c82f09adee8f 00 ...

  6. 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。

  7. [ts] Property 'aaa' does not exist on type 'Window' 解决办法

    第一种: (window as any).aaa 第二种: declare global { interface Window { aaa: any; } } window.aaa = window. ...

  8. 《转》完美解决微信video视频隐藏控件和内联播放问题

    地址:https://blog.csdn.net/xiao190128/article/details/81025378 var u = navigator.userAgent; var isAndr ...

  9. std::remove_reference

    [std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #inc ...

  10. 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中

    一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...