通过一道面试题了解Condition线程通信

Condition

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

面试题

  1 package com.ccfdod.juc;
  2
  3 import java.util.concurrent.locks.Condition;
  4 import java.util.concurrent.locks.Lock;
  5 import java.util.concurrent.locks.ReentrantLock;
  6
  7 /**
  8 * 题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
  9 * 如:ABCABCABC……
 10 */
 11 class AlternateDemo {
 12     //标志当前由哪一个线程输出,1代表A,2代表B,3代表C
 13     private int number = 1;
 14
 15     Lock lock = new ReentrantLock();
 16
 17     //Condition的强大之处在于它可以为多个线程间建立不同的Condition
 18     Condition condition1 = lock.newCondition();
 19     Condition condition2 = lock.newCondition();
 20     Condition condition3 = lock.newCondition();
 21
 22     // loopNum:当前循环轮数
 23     public void loopA(int loopNum) {
 24         //上锁
 25         lock.lock();
 26         try {
 27             while (number != 1) {
 28                 //等待
 29                 condition1.await();
 30             }
 31
 32             System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
 33             number = 2;
 34             //唤醒
 35             condition2.signal();
 36
 37         } catch (InterruptedException e) {
 38             e.printStackTrace();
 39         } finally {
 40             //确保释放锁
 41             lock.unlock();
 42         }
 43     }
 44
 45     public void loopB(int loopNum) {
 46         lock.lock();
 47         try {
 48             while (number != 2) {
 49                 condition2.await();
 50             }
 51
 52             System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
 53             number = 3;
 54             condition3.signal();
 55
 56         } catch (InterruptedException e) {
 57             e.printStackTrace();
 58         } finally {
 59             lock.unlock();
 60         }
 61     }
 62
 63     public void loopC(int loopNum) {
 64         lock.lock();
 65         try {
 66             while (number != 3) {
 67                 condition3.await();
 68             }
 69
 70             System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum);
 71             number = 1;
 72             condition1.signal();
 73
 74         } catch (InterruptedException e) {
 75             e.printStackTrace();
 76         } finally {
 77             lock.unlock();
 78         }
 79     }
 80 }
 81
 82 public class TestABCAlternate {
 83
 84     public static void main(String[] args) {
 85         AlternateDemo ad = new AlternateDemo();
 86
 87         new Thread(new Runnable() {
 88
 89             @Override
 90             public void run() {
 91                 for (int i = 0; i < 10; i++)
 92                     ad.loopA(i);
 93             }
 94         }, "A").start();
 95
 96         new Thread(new Runnable() {
 97
 98             @Override
 99             public void run() {
100                 for (int i = 0; i < 10; i++)
101                     ad.loopB(i);
102             }
103         }, "B").start();
104
105         new Thread(new Runnable() {
106
107             @Override
108             public void run() {
109                 for (int i = 0; i < 10; i++)
110                     ad.loopC(i);
111             }
112         }, "C").start();
113     }
114 }
时间: 2024-07-28 19:11:41

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

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

①Condition 接口描述了可能会与锁有关联的条件变量. 这些变量在用 法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的 功能. 需要特别指出的是,单个 Lock 可能与多个 Condition 对象关 联. 为了避免兼容性问题,Condition 方法的名称与对应的 Object 版 本中的不同.② 在 Condition 对象中,与 wait.notify 和 notifyAll 方法对应的分别是 await.signal 和 signalAll.③ Condi

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

本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥?可以想银行取款的问题,如果不做监控,多个人同时针对一个存折取钱的时候就会出现钱不对的问题,下面我们通过两个例子来分析一下线程的互斥问题以及为什么会产生这个线程? 例子1:一个人生产信息,一个人消费信息 面向对象的思想:类 信息类 生产者 消费者 public class TriditionalTh

一道面试题:说说进程和线程的区别

一道面试题:说说进程和线程的区别 在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题.实现并发的方式有多种:比如多进程.多线程.IO多路复用. 多进程 进程是资源(CPU.内存等)分配的基本单位,它是程序执行时的一个实例.程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配C

线程基础知识系列(四)线程的同步2 线程通信和Condition变量

本文是系列的第四篇. 线程基础知识系列(三)线程的同步  :同步控制,锁及synchronized 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 第三篇文章,重点阐述了如何使用锁和同步块对线程间共享可变变量保护,保证只有一个线程可以进入临界区.其实,没有过多的涉及另一个重要的同步概念:线程协作.第三篇中涉及的线程间并没有有效的协调.

一道面试题:说说进程和线程的区别(转)

一道面试题:说说进程和线程的区别 在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题.实现并发的方式有多种:比如多进程.多线程.IO多路复用. 多进程 进程是资源(CPU.内存等)分配的基本单位,它是程序执行时的一个实例.程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配C

多线程之线程通信条件Condition

Condition是Locks锁下的另一种线程通信之间唤醒.阻塞的实现.它下面的await,和signal能够实现Object下的wait,notify和notifyAll的全部功能,除此之外改监视器和已绑定到每个条件,可以实现多条件的监听.Condition实质是被绑定到一个锁上,腰围特定的Lock实例获得Condition,即用 newCondition()方法. Condition下的await()相对于Object下的wait(); 阻塞或中断之前状况,让其处于等待状态. Conditi

Condition实现线程通信

当线程在系统中运行时,线程的调度具有一定的透明性,通常程序无法准确控制线程的轮换执行,如果有需要,Python 可通过线程通信来保证线程协调运行. 假设系统中有两个线程,这两个线程分别代表存款者和取钱者,现在假设系统有一种特殊的要求,即要求存款者和取钱者不断地重复存款.取钱的动作,而且要求每当存款者将钱存入指定账户后,取钱者就立即取出该笔钱.不允许存款者连续两次存钱,也不允许取钱者连续两次取钱. 为了实现这种功能,可以借助于 Condition 对象来保持协调.使用 Condition 可以让那

Google多线程面试题: 4个线程向4个文件里写入数据, 每个线程只能写一个值

By Long Luo 个人博客链接 最近在学习Java多线程时,遇到了一个下面的笔试题,题目如下: 编写一个程序,程序会启动4个线程,向4个文件A,B,C,D里写入数据,每个线程只能写一个值. 线程A:只写A 线程B:只写B 线程C:只写C 线程D:只写D 4个文件A,B,C,D. 程序运行起来,4个文件的写入结果如下: A:ABCDABCD... B:BCDABCDA... C:CDABCDAB... D:DABCDABC... 网上搜索了下,好像还是一个Google笔试题,这个问题涉及到的

多线程同步互斥实例——使用synchronized实现线程通信和互斥

线程互斥概念 线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 实现线程同步互斥的四种方式 临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用 互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似. 事件(Event):通过线程间触发事件实现同步互斥 信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理