18_Condition条件
【简述】
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条件的更多相关文章
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- 多线程条件通行工具——AbstractQueuedSynchronizer
本文原创,转载请注明出处! 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> AbstractOw ...
- 【NLP】前戏:一起走进条件随机场(一)
前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- LINQ to SQL Where条件
1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...
- MySQL 优化之 ICP (index condition pushdown:索引条件下推)
ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...
- FineReport:关于扩展行列求各种条件下的函数运用
最简单的扩展列,扩展行的求"最大,最小,平均"值的例子 设计图 效果图 相关函数 =MAX(B2:E2) =MIN(B2:E2) =AVERAGE(B2:E2) 这个是(满足条件) ...
- .NET深入实战系列--EF到底怎么写过滤条件
本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: ...
随机推荐
- 远程诊断DoIP
目录 远程诊断DoIP Part 1: General information and use case definition DoIP诊断网络架构 诊断连接场景 DoIP之通信建立 DoIP中的一些 ...
- sharepoint_study_1
描述:机器上进行SharePoint开发,需要SQL Server提供最基本的服务 解决: SQL Server 的数据库引擎: SQL Server 代理: SQL Server 浏览器组件:
- VBS修改本机的账号密码
On Error Resume Next strComputer = "." Set WshShell = WScript.CreateObject("WScript.S ...
- 编辑距离及编辑距离算法(求字符的相似度) js版
编辑距离概念描述: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如 ...
- spring框架中由FactoryBean获取JedisCluster实例
spring配置文件: <bean id="jedisCluster" class="com.pingan.ela.structure.ex.JedisCluste ...
- CDH与原生态hadoop之间的区别(转)
需要认识的几个问题 ------------------------------------------------------------------------------------------ ...
- 基于setTimeout制作滚动广告板
很多网站在其门户页面的上方正中央都会放置一个滚动广告板,用于显示一些推荐信息,用户点击即可进入浏览.比较常见的就是各个公司的官网,电商网站的首页等. 下面是天猫的滚动广告板截图. 其实,不需要借助于什 ...
- Http编程之HttpClient
在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...
- 解决 command not found: express
需要先执行 sudo npm install -g express-generator 再安装 sudo npm install -g express 建立项目骨架 express -e xxx
- 【JAVA】java方法覆写规则
A.重写规则之一: 重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString() ...