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中通常的做法是: ...
随机推荐
- AtCoder - 2566 优先队列
Let N be a positive integer. There is a numerical sequence of length 3N, a=(a1,a2,…,a3N). Snuke is c ...
- sock文件
无论是mysql,uwsgi还是nginx都会用到sock文件 首先它是由程序自动创建的,并不是我们自己手动.它的作用是用来通信.与之相对应的是tcp socket ,一般的程序会同时支持这两种方式, ...
- angluarJs与后台交互get
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- C++_函数1-编程的基本模块函数
以下是<C++ Primer Plus>中第七章的内容: 使用C++函数的3个步骤: 提供函数定义 提供函数原型 调用函数 7.1.1 定义函数 函数分成两类:没有返回值的函数.有返回值的 ...
- DP设状态 : 状压与线
[NOIP2017]宝藏(状压) [AHOI2009]中国象棋(状压) [BZOJ1814] URAL1519 Formula 1(插头\(DP\)模板) 新链接 : Luogu5056 , dark ...
- 论文阅读 | STDN: Scale-Transferrable Object Detection
论文地址:http://openaccess.thecvf.com/content_cvpr_2018/papers/Zhou_Scale-Transferrable_Object_Detection ...
- 墨菲定律&吉德林法则&吉尔伯特定律&沃尔森法则&福克兰定律
一.墨菲定律:越害怕什么,就越会发生什么 二.吉德林法则:把问题清楚地写下来,就已经解决一半了 三.吉尔伯特定律:工作中的最大问题就是没人跟你说该如何去做 四.沃尔森法则:把信息和情报排在第一位,金钱 ...
- http请求报文和响应报文(2)
接上篇: 3.回应报文 理解回应报文,首先要弄清回应报文中的状态码. 相比于请求报文,对于响应报文,个人觉得还蛮有趣的. 主要由三部分组成:协议版本.状态码.状态码描述 3.1状态码 **常见的状态码 ...
- oracle 笔记---(七)__角色
一,角色介绍 角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理,假定有用户a,b,c为了让他们都拥有权限:连接数据库和在scott.emp表上select,insert,updat ...
- ubuntu安装VMware Tools报错enter the path to the kernel header files
$ sudo apt-get install build-essential linux-headers-$(uname -r) cd /lib/modules/$(uname -r)/build/i ...