【简述】

wait()和notify()方法是和synchronized关键字合作使用的。

Condition是和重入锁相关联的,通过ReentrantLock.newCondition()生成一个与当前重入锁绑定的Condition实例。

利用Condition对象,可以让线程在合适的时间等待,或者在某一个特定的时间得到通知,继续执行。

【Condition提供的基本方法】

await():会使当前线程等待,同时释放锁。当其他线程使用signal()或signalAll()方法时,线程会重新获得锁屏继续执行。或者当线程被中断时,也能跳出等待。

awaitUninterruptibly():与await()方法基本相同,但是它不会在等待的过程中响应中断。

signal():用于唤醒一个在等待中的线程。

signalAll():唤醒所有在等待中的线程。

【Condition实例】

package com.higgin.reentrantLock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by HigginCui on 2017/5/17.
*/
public class ConditionThread implements Runnable{ public static ReentrantLock lock = new ReentrantLock(); public static Condition condition = lock.newCondition(); //生成一个与当前重入锁lock绑定的condition实例 @Override
public void run() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+" 开始运行");
condition.await(); //线程等待(会响应中断),会让当前线程释放占用的锁lock,必须在lock()和unlock()之间
System.out.println(Thread.currentThread().getName()+" 继续运行");
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()+" 进入响应中断!");
} finally {
lock.unlock(); //释放锁
System.out.println(Thread.currentThread().getName()+" 释放锁!");
}
} public static void main(String[] args) throws InterruptedException{
ConditionThread ct = new ConditionThread();
Thread t = new Thread(ct,"conditionThread");
t.start();
System.out.println(Thread.currentThread().getName()+"线程 开始运行!");
Thread.sleep(); lock.lock(); //调用singnal()方法前,main线程先获得相关的锁
condition.signal(); //从当前Condition对象的等待队列中,唤醒一个线程,此时main线程依然占用着锁
Thread.sleep();
System.out.println(Thread.currentThread().getName()+"线程 已经在2秒前唤醒一个等待线程了,单依然占用着锁,,现在准备释放锁");
lock.unlock(); //释放锁,给被唤醒的线程,此时conditionThread线程才可以获得锁继续运行
}
}

【运行结果】

【分析】

Condition.await()方法调用后,当前线程会释放锁。

Condition.signal()方法调用后,系统会从当前Condition对象的等待队列中,唤醒一个线程。

一旦线程被唤醒,它会重新尝试获得与之绑定的重入锁,一旦成功获取,就可以继续执行了。

因此,在signal()方法调用之后,一般需要释放相关的锁,谦让给被唤醒的线程,让被唤醒的线程获得锁继续执行。

18_Condition条件的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  3. 多线程条件通行工具——AbstractQueuedSynchronizer

    本文原创,转载请注明出处! 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> AbstractOw ...

  4. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  5. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  6. LINQ to SQL Where条件

    1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...

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

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

  8. FineReport:关于扩展行列求各种条件下的函数运用

    最简单的扩展列,扩展行的求"最大,最小,平均"值的例子 设计图 效果图 相关函数 =MAX(B2:E2) =MIN(B2:E2) =AVERAGE(B2:E2) 这个是(满足条件) ...

  9. .NET深入实战系列--EF到底怎么写过滤条件

    本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: ...

随机推荐

  1. Win7 如何阻止程序联网

    https://jingyan.baidu.com/article/9113f81b03d4e12b3214c7c3.html

  2. C语言学习总结(1)——结构体

      一,什么是结构体    我们知道数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄 ...

  3. 多线程 NSOpeartion 的使用

    NSOperation简介 相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强 NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 ...

  4. rabbitmq生产者代码,以及过程参数含义:

    首先pom依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  5. async中series的实现 javascript构件

    //同步流程 var series=function(arr){ function async(i){ arr[i](function(){ if(1+i<arr.length){ async( ...

  6. mysql 配置文件详解

    mysql配置文件参数详解 (一) [client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql ...

  7. js 判断各种数据类型 typeof 几种类型值

    了解js的都知道, 有个typeof  用来判断各种数据类型,有两种写法:typeof   xxx   ,typeof(xxx) 如下实例: typeof   2      输出   number   ...

  8. Ubuntu Server 14 配置

    语言 在虚拟机中安装了Ubuntu Server. Ubuntu Server只有控制台,没有图形界面.要在控制台下安装中文支持很麻烦.所以直接设置为英文,反正我看得懂. 在安装的时候必须将" ...

  9. 第一章:hybrid app开发之技术选型

    伴随着移动互联网的兴起,越来越多的企业将部分资源投入其中,想在互联网+的大潮中分一杯羹,并期望着站在风口上,成为时代的弄潮儿. 现在不会做一个app都不好意思说是搞互联网的,那么开发一个app的方式有 ...

  10. TOJ 2733 棋盘游戏

    Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是 Gardon限制了只有某些格子才 ...