多线程面试题之【三线程按顺序交替打印ABC的方法】
建立三个线程,线程名字分别为:A、B、C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。打印10轮,打印完毕控制台输出字符串:"打印完毕"
方法之一:使用Condition等待唤醒机制,代码如下:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by gan on 2019/5/19 10:54.
*/
public class ConditionDemo { private static int num = 1; //打印“谁”标识符 private static Lock lock = new ReentrantLock();
private static final Condition conditionA = lock.newCondition();
private static final Condition conditionB = lock.newCondition();
private static final Condition conditionC = lock.newCondition(); private static CountDownLatch countDownLatch = new CountDownLatch(10); //使用闭锁计数器 public static void main(String[] args) throws Exception { long loop = countDownLatch.getCount(); //初始化打印轮数 new Thread(() -> {
for (int i = 1; i <= loop; i++) {
try {
printA();
} catch (InterruptedException e) {
}
}
}, "A").start(); new Thread(() -> {
for (int i = 1; i <= loop; i++) {
try {
printB();
} catch (InterruptedException e) {
}
}
}, "B").start(); new Thread(() -> {
for (int i = 1; i <= loop; i++) {
try {
printC(i);
} catch (InterruptedException e) {
}
}
}, "C").start(); countDownLatch.await(); System.out.println("打印完毕.........");
} //打印‘A’的方法
public static void printA() throws InterruptedException {
lock.lock();
if (num != 1) { //标识符等于1的时候打印A
conditionA.await();
}
System.out.print(Thread.currentThread().getName());
num = 2;
conditionB.signal();
lock.unlock();
} //打印‘B’的方法
public static void printB() throws InterruptedException {
lock.lock();
if (num != 2) { //标识符等于2的时候打印B
conditionB.await();
}
System.out.print(Thread.currentThread().getName());
num = 3;
conditionC.signal();
lock.unlock();
} //打印‘C’的方法
public static void printC(int loop) throws InterruptedException {
lock.lock();
if (num != 3) { //标识符等于3的时候打印A
conditionC.await();
}
System.out.print(Thread.currentThread().getName());
System.out.print("[" + loop + "]"); //轮数间隔符号
num = 1;
conditionA.signal();
countDownLatch.countDown();
lock.unlock();
} } 运行结果如下:
多线程面试题之【三线程按顺序交替打印ABC的方法】的更多相关文章
- 用三个线程按顺序循环打印ABC三个字母
有两种方法:semaphore信号量和mutex互斥锁.需要注意的是C++11已经没有semaphore. C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFau ...
- 多个线程分别顺序交替打印一种不同字符abcdefg(已实现随便多少个线程打印多少个字符,利用线程池实现多线程)
下面实现多线程顺序打印字符"abcdefg": 实现Runnable接口: /** * @author: rhyme * @date: 2019-08-17 14:39 * @to ...
- 三个线程ABC,交替打印ABC
转载与:https://www.cnblogs.com/x_wukong/p/4009709.html 创建3个线程,让其交替打印ABC . 输出如下: ABCABCABCABC. 方法:使用syn ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- 【Java多线程系列四】控制线程执行顺序
假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...
- python多线程交替打印abc以及线程池进程池的相关概念
import threading import sys import time def showa(): while True: lockc.acquire() #获取对方的锁,释放自己的锁 prin ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_18-练习三_按指定格式打印集合的方法
主要锻炼用集合作为参数 使用if判断语句
- 一道有意思的多线程面试题 C# 代码实现
如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助.鼓励先自己动手实现一遍,做不出来在看代码. 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
随机推荐
- 和重复搭建开发环境说 Bye Bye 之Vagrant
每每新同事入职,都要在自己电脑上配置一堆环境,费神费力:每每开发测试都要重新配置开发环境,手工搭建,步骤很繁琐,极易出错. 大神在时,大神搭建,大神不在,以手抚膺坐长叹.为此,VVVVVagrant横 ...
- 常用的web api总结
1.querySelector 获取指定元素中匹配css选择器的元素. // 作用在document document.querySelector("#nav"); // 获取文档 ...
- VOT-2016 代码评测工具的使用说明
VOT-2016 代码评测工具的使用说明 2018-10-14 09:37:04 VOT-2016 官网:http://www.votchallenge.net/vot2016/ 评测代码链接:htt ...
- java/spring boot/dubbo/spring cloud/微服务/SOA/分布式经典电子书籍pdf下载
微服务系列 官方文档是最好的资料了. spring cloud官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.RELEASE/si ...
- 实现一个自己的IOC
实现一个自己的IOC package com.IocExample; import java.lang.reflect.Constructor; import java.lang.reflect.In ...
- Socket通信(1):搭建开发环境
一. 准备工具 1. mac环境下的VMware Fusion, 下载地址:https://www.newasp.net/soft/462096.html 2. ubuntu 14.04 LTS, 不 ...
- 美国gfs数据介绍和解析
最近有个项目需要开发个气象信息API,可以通过经纬度查找未来几天的气象信息. 经过几天的研究,现在简单总结一下. 1.数据来源数据来源采自美国国家环境预报中心的GFS(全球预报系统),该系统每天发布4 ...
- pytorch 想在一个优化器中设置多个网络参数的写法
使用tertools.chain将参数链接起来即可 import itertools ... self.optimizer = optim.Adam(itertools.chain(self.enco ...
- QQ第三方登录回调地址的问题
如题,维护以前的项目,发现原来QQ的第三方登录竟然失败了.回调地址的问题 原来是以前的规则变了.好吧,那就改,谁叫我不是改变规则的人. 中途浪费了点时间,项目很大,我一下也找不到项目里那个接口调用的, ...
- 算法习题---5.6团体队列(Uva540)
一:题目 有t个队伍的人正在排队,每次新来一个人,如果他有队友在排队,那他可以插队,直接排到他的队伍的末尾.如果没有队伍在前面,那么他直接排在长队的末尾 ENQUEUE x 将编号x的队员入队 DEQ ...
