目录

一、Condition简介

二、Condition常用API

三、Condition顺序访问案例


一、Condition简介

JUC提供了Lock同步锁可以方便的进行锁操作,但是有时候我们也需要对线程进行条件性的阻塞和唤醒,这时我们就需要结合Condition条件变量来对持有锁的线程进行阻塞和唤醒。

Condition接口,也称为条件队列或条件变量,提供了一种方法,让一个线程暂停执行,直到另一个线程通知某个状态条件,才唤醒其继续执行。

Condition实例本质上绑定到锁,使用其newCondition()方法即可获取特定锁实例的条件实例。Condition一般配合RenentrantLock可重入锁使用,在上一篇的生产者消费者模型中其实我们已经看过Condition的简单使用,下面详细介绍一下Condition接口。

二、Condition常用API

void

await()

导致当前线程等待,直到发出信号或中断它。

boolean

await(long time, TimeUnit unit)

导致当前线程等待,直到发出信号或中断它,或指定的等待时间过期。

long

awaitNanos(long nanosTimeout)

导致当前线程等待,直到发出信号或中断它,或指定的等待时间过期。

void

awaitUninterruptibly()

导致当前线程等待,直到它被通知。

boolean

awaitUntil(Date deadline)

导致当前线程等待,直到发出信号或中断它,或指定的截止日期过期。

void

signal()

唤醒一个正在等待的线程。

void

signalAll()

唤醒所有等待的线程。

以上是Condition接口中常见的一些方法,更加详细的介绍也可以到官网https://docs.oracle.com/javase/8/docs/api/index.html进行了解。

三、Condition顺序访问案例

示例:多线程之间按顺序调用,实现AA -> BB -> CC依次打印。

案例分析:

要实现按顺序打印,那么是否要有一些标志,标志当前需要打印AA还是BB还是CC:

/*** 标志位* A :1* B : 2* C : 3*/
private int number = 1;

当打印完AA后,将number修改为2,打印完BB后,将n的umber修改为3,打印完CC后将number修改为1,依次重复,然后再创建三个分别代表打印AA/BB/CC的Condition绑定到Lock上。

/*** 多线程之间按顺序调用,实现AA->BB->CC依次打印* 也即精确通知顺序访问*/
public class T07_ConditionDemo {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(() -> {for (int i = 0; i < 3; i++) {shareData.printAA();}}).start();new Thread(() -> {for (int i = 0; i < 3; i++) {shareData.printBB();}}).start();new Thread(() -> {for (int i = 0; i < 3; i++) {shareData.printCC();System.out.println("===================");}}).start();}
}class ShareData {/*** 标志位* A :1* B : 2* C : 3*/private int number = 1;/*** 可重入锁*/private Lock lock = new ReentrantLock();/*** 打印AA的条件*/private Condition conditionA = lock.newCondition();/*** 打印BB的条件*/private Condition conditionB = lock.newCondition();/*** 打印CC的条件*/private Condition conditionC = lock.newCondition();public void printAA() {lock.lock();try {while (number != 1) {conditionA.await();}for (int i = 0; i <= 4; i++) {System.out.println("AA");}number = 2;//唤醒打印BB的线程conditionB.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void printBB() {lock.lock();try {while (number != 2) {conditionB.await();}for (int i = 0; i < 5; i++) {System.out.println("BB");}number = 3;//唤醒打印CC的线程conditionC.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void printCC() {lock.lock();try {while (number != 3) {conditionC.await();}for (int i = 0; i < 5; i++) {System.out.println("CC");}number = 1;//唤醒打印AA的线程conditionA.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}

运行结果:

AA
AA
AA
AA
AA
BB
BB
BB
BB
BB
CC
CC
CC
CC
CC
AA
AA
AA
AA
AA
===================
BB
BB
BB
BB
BB
CC
CC
CC
CC
CC
===================
AA
AA
AA
AA
AA
BB
BB
BB
BB
BB
CC
CC
CC
CC
CC
===================

以上就是使用Condition实现了精确通知某个线程然后按顺序访问。

并发编程学习之Condition和顺序访问相关推荐

  1. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  2. 高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  3. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  4. java并发编程学习一

    java并发编程学习一 什么是进程和线程? 进程是操作系统进行资源分配的最小单位 进程跟进程之间的资源是隔离的,同一个进程之中的线程可以共享进程的资源. 线程是进程的一个实体,是CPU 调度和分派的基 ...

  5. java中解决脏读_java并发编程学习之脏读代码示例及处理

    使用interrupt()中断线程     当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即 ...

  6. java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁

    在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方 ...

  7. java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式

    Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...

  8. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  9. 【并发入门】Java 并发编程学习笔记

    注:该笔记主要记录自 B站 up主 遇见狂神说的个人空间_哔哩哔哩_bilibili 1.什么是 JUC Java 工具类中的 并发编程包 学习:源码 + 官方文档 业务:普通的线程代码 Thread ...

  10. Java并发编程学习 + 原理分析(建议收藏)

    总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 Doug Lea是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为 ...

最新文章

  1. asp.net javascrip获取session的值_一篇文章搞定 Django Cookie 与 Session
  2. P4718 【模板】Pollard-Rho算法
  3. document.getElementById找不到元素
  4. Typescript 类型的常用知识与技能
  5. Day 1 MySQL数据库
  6. mysql 本月第几周_Mysql 计算当前日期是本月第几周:一个自定义算法
  7. 安装配置fcitx输入法
  8. MATLAB身份证号码识别系统(GUI论文)
  9. dnf时装补丁教程_DNF时装补丁制作教程
  10. android微信视频自动播放,Android微信内网页音频自动播放能力调整
  11. android传感器获取运动方向,Android 重力感应获取手机运动方向和角度
  12. 解决beyond compare秘钥被吊销的问题
  13. mysql ndb存储引擎_Cluster的NDB存储引擎
  14. 百度糯米用大数据重塑O2O产业
  15. 单元测试怎么就成了银弹?
  16. 编写python程序、计算账户余额_《计算机科学丛书PYTHON程序设计(原书第2版)/(美])凯.S.霍斯特曼》【价格 目录 书评 正版】_中国图书网...
  17. 12-机械键盘和普通键盘的区别
  18. 热门编程语言那么多,该选择哪个
  19. onedrive登陆以后是白板,我下载了onedrive以后,安装到登陆界面,输入账号,提示:我们的系统中没有 - Microsoft Community...
  20. OpenCV中文文档

热门文章

  1. 畅想未来计算机300字,畅想未来作文300字
  2. MLOps- 吴恩达Andrew Ng Data Definition and Baseline Week3 论文等资料汇总
  3. NumPy库---数组的基本操作
  4. python操作数据库的两种方式
  5. Linux下获取时间差(毫秒级)
  6. 最新android APP框架介绍
  7. 【Codeforces Round #291 (Div. 2) C】Watto and Mechanism【Trie树、Hash】
  8. wifipumpkin3 WiFi钓鱼工具
  9. Hibernate getById方法 could not initialize proxy - no session
  10. 1.SpringDataJPA (查询:主键或其他字段、增加/修改、分页) 2021最新技术~方便快捷 博主可答疑