Java多线程编程笔记之Condition
本篇内容基于JDK7,涉及Condition常用方法。
1.概述
Condition接口位于java.util.concurrent.locks包下,实现类有
AbstractQueuedLongSynchronizer.ConditionObject和
AbstractQueuedSynchronizer.ConditionObject。Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用。其中,Lock替代了synchronized方法的使用及作用,Condition替代了Object监视器方法的使用及作用。Condition的await方法代替Object的wait;Condition的signal方法代替Object的notify方法;Condition的signalAll方法代替Object的notifyAll方法。Condition实例在使用时需要绑定到一个锁上,可以通过newCondition方法获取Condition实例。Condition实现可以提供不同于Object监视器方法的行为和语义,比如受保证的通知排序,或者在执行通知时不需要保持一个锁。
2.使用样例
下面的代码演示了Condition简单使用的样例。
public class ConditionDemo {@Testpublic void test() {final ReentrantLock reentrantLock = new ReentrantLock();final Condition condition = reentrantLock.newCondition();new Thread(new Runnable() {@Overridepublic void run() {try {reentrantLock.lock();System.out.println(Thread.currentThread().getName() + "在等待被唤醒");condition.await();System.out.println(Thread.currentThread().getName() + "恢复执行了");} catch (InterruptedException e) {e.printStackTrace();} finally {reentrantLock.unlock();}}}, "thread1").start();new Thread(new Runnable() {@Overridepublic void run() {try {reentrantLock.lock();System.out.println(Thread.currentThread().getName() + "抢到了锁");condition.signal();System.out.println(Thread.currentThread().getName() + "唤醒其它等待的线程");} catch (Exception e) {e.printStackTrace();} finally {reentrantLock.unlock();}}}, "thread2").start();}
}
复制代码
输出结果如下所示:
thread1在等待被唤醒
thread2抢到了锁
thread2唤醒其它等待的线程
thread1恢复执行了
复制代码
3.创建Condition实例
通过Lock接口实现类的newCondition方法获取Condition实例,例如如下代码:
ReentrantLock reentrantLock = new ReentrantLock();
Condition condition = reentrantLock.newCondition();
复制代码
4.常用方法
4.1 await()
调用await方法后,当前线程在接收到唤醒信号之前或被中断之前一直处于等待休眠状态。调用此方法时,当前线程保持了与此Condition有关联的锁,调用此方法后,当前线程释放持有的锁。此方法可以返回当前线程之前,都必须重新获取与此条件有关的锁,在线程返回时,可以保证它保持此锁。
4.2 await(long time,TimeUnit unit)
调用此方法后,会造成当前线程在接收到唤醒信号之前、被中断之前或到达指定等待时间之前一直处于等待状态。调用此方法时,当前线程保持了与此Condition有关联的锁,调用此方法后,当前线程释放持有的锁。time参数为最长等待时间;unit参数为time的时间单位。如果在从此方法返回前检测到等待时间超时,则返回 false,否则返回true。此方法可以返回当前线程之前,都必须重新获取与此条件有关的锁,在线程返回时,可以保证它保持此锁。
4.3 awaitNanos(long nanosTimeout)
该方法等效于await(long time,TimeUnit unit)方法,只是等待的时间是
nanosTimeout指定的以毫微秒数为单位的等待时间。该方法返回值是所剩毫微秒数的一个估计值,如果超时,则返回一个小于等于0的值。可以根据该返回值来确定是否要再次等待,以及再次等待的时间。
4.4 awaitUninterruptibly()
调用此方法后,会造成当前线程在接收到唤醒信号之前一直处于等待状态。如果在进入此方法时设置了当前线程的中断状态,或者在等待时,线程被中断,那么在接收到唤醒信号之前,它将继续等待。当最终从此方法返回时,仍然将设置其中断状态。调用此方法时,当前线程保持了与此Condition有关联的锁,调用此方法后,当前线程释放持有的锁。此方法可以返回当前线程之前,都必须重新获取与此条件有关的锁,在线程返回时,可以保证它保持此锁。
4.5 awaitUntil(Date deadline)
调用此方法后,会造成当前线程在接收到唤醒信号之前、被中断之前或到达指定最后期限之前一直处于等待休眠状态。调用此方法时,当前线程保持了与此Condition有关联的锁,调用此方法后,当前线程释放持有的锁。此方法可以返回当前线程之前,都必须重新获取与此条件有关的锁,在线程返回时,可以保证它保持此锁。
4.6 signal()
唤醒一个等待线程,如果所有的线程都在等待此条件,则选择其中的一个唤醒。在从await返回之前,该线程必须重新获取锁。
4.7 signalAll()
唤醒所有等待线程,如果所有的线程都在等待此条件,则唤醒所有线程。 在从await返回之前,每个线程必须重新获取锁。
Java多线程编程笔记之Condition相关推荐
- java 静态代码块 多线程,Java多线程编程笔记10:单例模式
立即加载:"饿汉模式" 立即加载就是指使用类的时候已经将对象创建完毕,常见的实现方法就是直接new实例化.也就是在调用方法前,实例就被创建了.示例代码如下所示: class MyO ...
- Java多线程编程笔记4:Java内存模型
Java内存模型 Java内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果. 处理器上的寄存器读写速度比内存快几个数量级,为了解决这种速度矛 ...
- 《Java多线程编程核心技术》读书笔记
为什么80%的码农都做不了架构师?>>> <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...
- java多线程基础视频_【No996】2020年最新 Java多线程编程核心基础视频课程
01.课程介绍.mp4 02.多线程编程基础-进程与线程.mp4 03.多线程编程基础-使用多线程-继承Thread类.mp4 04.多线程编程基础-使用多线程-实现Runnable接口.mp4 05 ...
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
转载自 详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...
- Java并发编程笔记之 CountDownLatch闭锁的源码分析
转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...
- java多线程编程01---------基本概念
一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...
- Java网络编程笔记5
在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...
最新文章
- 自考微型计算机原理与接口技术试卷,200204自考微型计算机原理与接口技术试题.doc...
- geotrellis使用(三十)使用geotrellis读取PostGIS空间数据
- SAP Analytics Cloud学习笔记(一):从CSV文件导入数据到Analytics Cloud里创建模型和Story
- 排队8小时,火遍上海!美国最会装X的网红咖啡,又把中国人拿捏了
- jsp篇 之 指令元素和动作元素
- JAVA蓝桥杯:高精度算法
- zookeeper源码-分布式锁
- 无处 不在的无线智能——6g 的关键驱动与研究挑战_一文看懂什么是 6G
- 使用idea创建项目并通过git上传到码云
- Effective Java 思维导图
- K610D i7 D2 HM86 HD4600 安装 Mac OS 10.15.2 提供工具和EFI
- 汇编语言小写字母转换为大写字母
- 系统和环境(建模与仿真)
- Nginx 301重定向域名
- CentOS7 忘记登陆密码 修改root密码
- 绿岛风IPO上市已过会 加大人才储备 创新管理模式
- android action pick,android – 无法使用ACTION_PICK意图选择特定图...
- H5移动端知识点总结
- 华为云大数据智能数据湖FusionInsight
- 【漫画】员工当腻了,不如做领导!
热门文章
- python能够做什么软件-Python能做什么
- python人工智能-马哥教育官网-专业Linux培训班,Python培训机构
- python输入任意多个成绩-Python 实现输入任意多个数,并计算其平均值的例子
- python3基础教程廖雪峰云-学习廖雪峰Python3教程的pytho
- usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...
- 乐鑫wifi模块二次开发_米家部分智能硬件拆解,ZigBee/WIFI模块分析及二次开发
- EnableFeignClients注解解析
- UVa1377 Ruler(dfs或者bfs)
- LeetCode Remove Duplicates from Sorted List II
- activity的使用(八):生命周期