【简述】

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. 自已的sql server练习小记

    print getdate(); print datediff(year,'1987-09-13',getdate()) select * from CallRecords select top 5 ...

  2. 二分答案 & 洛谷 P2678 跳石头

    首先让我们先学一下二分答案这个东西...   二分答案,肯定与二分有关,还与可能是答案的东西有关... 二分答案的准确定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转 ...

  3. apache的URL重写

    apache的url重写 第一步:修改apache\conf目录下的的httpd.conf文件 1.加载apache的url重写模块 大概122行:LoadModule rewrite_module ...

  4. python学习之路---day04

    一:元组 元组案例:tuple=("张三","李四","王五","小六","大七",["1 ...

  5. liunx php-fpm

    查看php-fpm 相关信息 查看php-fpm是否开启 :ps -ef|grep php 查看php-fpm的位置:whereis php-fpm 查看php-fpm进程数:ps aux | gre ...

  6. HDU - 5661

    /*H E A D*/ int main(){ int T=read(); while(T--){ ll a=read(); ll b=read(); ll c=read(); ll d=read() ...

  7. springboot(六)-使用shiro

    前提 写之前纠结了一番,这一节放在shiro里面还是springboot里面.后来想了下,还是放springboot里吧,因为这里没有shiro的新东西,只有springboot添加了新东西的使用. ...

  8. Oracle:DBMS_STATS.GATHER_TABLE_STATS的语法

    转自: http://cjjwzs.iteye.com/blog/1143893 作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息. DBMS_STATS.G ...

  9. poj3176

    一.题意:给定一些数,成三角形排列.从上往下走,每个数只能往它相邻的两个数走,一直走到底端得到一条线路.这条线路上的数的和最大是多少 二.思路:简单的动态规划.dp[i+1][j+1]:=以第i+1行 ...

  10. git——合并分支

    A将自己的本地代码提交到远程A分支,此时master主干上有B新提交的代码,如果此时A把自己的代码merge到主干,会有冲突,那怎么办? 1.A将自己的代码提交到自己的A分支 2.git fetch ...