Condition

  • Condition接口描述了可能会与锁有关联的条件变量。这些变量在用法与使用Object.wait访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个Lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的Object版本中的不同;
  • 在Condition对象中,与wait、notify和notifyAll方法对应的分别是await、signal和signalAll;
  • Condition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例,请使用器newCondition()方法。

面试题

 package com.ccfdod.juc;

 import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
* 如:ABCABCABC……
*/
class AlternateDemo {
//标志当前由哪一个线程输出,1代表A,2代表B,3代表C
private int number = 1; Lock lock = new ReentrantLock(); //Condition的强大之处在于它可以为多个线程间建立不同的Condition
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition(); // loopNum:当前循环轮数
public void loopA(int loopNum) {
//上锁
lock.lock();
try {
while (number != 1) {
//等待
condition1.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 2;
//唤醒
condition2.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
//确保释放锁
lock.unlock();
}
} public void loopB(int loopNum) {
lock.lock();
try {
while (number != 2) {
condition2.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 3;
condition3.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} public void loopC(int loopNum) {
lock.lock();
try {
while (number != 3) {
condition3.await();
} System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
number = 1;
condition1.signal(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
} public class TestABCAlternate { public static void main(String[] args) {
AlternateDemo ad = new AlternateDemo(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopA(i);
}
}, "A").start(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopB(i);
}
}, "B").start(); new Thread(new Runnable() { @Override
public void run() {
for (int i = 0; i < 10; i++)
ad.loopC(i);
}
}, "C").start();
}
}

通过一道面试题了解Condition线程通信的更多相关文章

  1. Condition线程通信(七)

    前言:对于线程通信,使用synchronized时使用wait.notify和notifyAll来实行线程通信.而使用Lock如何处理线程通信呢?答案就是本片的主角:Condition. 一.Cond ...

  2. java 多线程 day13 condition 线程通信

    /** * Created by chengtao on 17/12/5. * Condition 类似 wait和notify,解决线程间的同步问题 */ import java.util.conc ...

  3. 一道面试题来了解线程notifyAll()和wait()的方法

    题目:三个线程,分别打印A.B.C,要求按ABC的顺序循环打印10次. package com.slowcity.crud.controller; public class PrintOneTwoTh ...

  4. Condition线程通信_生产者消费者案例

    ①Condition 接口描述了可能会与锁有关联的条件变量. 这些变量在用 法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的 功能. 需要特别指出的是,单个 Lock 可能与 ...

  5. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...

  6. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

  7. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  8. 多线程之线程通信条件Condition

    Condition是Locks锁下的还有一种线程通信之间唤醒.堵塞的实现.它以下的await,和signal可以实现Object下的wait,notify和notifyAll的所有功能,除此之外改监视 ...

  9. Condition控制线程通信

    Condition控制线程通信 一.前言 java.util.concurrent.locks.Condition 接口描述了可能会与锁有关联的条件变量.这些变量在用法上与使用Object.wait ...

随机推荐

  1. iClap的名字是怎么来的,clap是有什么特殊的意义么?

    iClap的名字来源于:Clap中文是鼓掌的意思,鼓掌代表合拍,一个团队的价值观以及工作方式合拍,是最重要的,当项目启动时,大家对产品认可,鼓掌开始实施:当项目成功上线,团队也会以鼓掌的形式庆祝:当我 ...

  2. loadrunner:设置检查点的几种方法

    判断操作是否成功,检查点是必不可少的.loadrunner中可以设置文本检查点和图片检查点,下面记录一下loadrunner设置检查点的几种方法. 前言:在回放脚本时,必须确定run-time set ...

  3. Spring-1-I 233 Matrix(HDU 5015)解题报告及测试数据

    233 Matrix Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descript ...

  4. 简单介绍--TOSCA自动化测试工具

    1.工具源自 TOSCA由公司Tricentis研发.这是一家来自奥地利的软件初创企业,专门帮助企业开发团队进行自动化软件测试.(百科) TOSCA的思想是,不用会编程的测试人员可以直接上手自动化. ...

  5. Win10应用《纸书科学计算器》更新啦!

    <纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...

  6. motan rpc

    git :  帮助 文档 基本介绍 Motan是一套基于java开发的RPC框架,除了常规的点对点调用外,Motan还提供服务治理功能,包括服务节点的自动发现.摘除.高可用和负载均衡等.Motan具有 ...

  7. 使用selenium前学习HTML(3)——元素

    <!-- HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening tag),结束标签常称为闭合标签(clos ...

  8. 前端学习笔记之HTML中的id,name,class区别

    name 属性用于在 JavaScript 中对元素进行引用,或者在表单提交之后,对表单数据进行引用. html的name和id可以类比身份证的姓名和身份证编号,编号id具有唯一性,一个id只出现一次 ...

  9. MBR主引导记录

    LBA的寻址方式可以让我们支持2TB,这是因为分区相对起始扇区号(分区项08-11个字节)和分区最大扇区数(分区项12-15个字节)的位数都是32bit.也就是0xFFFFFFFF*512/1024/ ...

  10. Redis-与python交互

    安装包 到中文官网查找客户端代码 联网安装 sudo pip install redis 使用源码安装 unzip redis-py-master.zip cd redis-py-master sud ...