多线程面试题之【三线程按顺序交替打印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) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
随机推荐
- System.Net.WebRequest.cs
ylbtech-System.Net.WebRequest.cs 发出对统一资源标识符(URI)的请求.这是一个 abstract 类. 1.返回顶部 1. #region 程序集 System, V ...
- ISO/IEC 9899:2011 条款6.8.6——跳转语句
6.8.6 跳转语句 语法 1.jump-statement: goto identifier ; continue ; break ; return expressio ...
- test20190904
- netty5服务端检测心跳超时断连
客户端每5秒发送一次心跳给服务端,服务端记录最后一次心跳时间,通过定时任务每10秒检测一下,如果当前时间与最后一次收到的心跳时间之差超过某个阈值,断开与客户端的连接.基于之前的例子(netty5心跳与 ...
- Spring cloud微服务安全实战-3-7API安全机制之数据加密
这一节来聊一下密码的加密. 加密盐,为了避免两个相同的面加密出来的密文是一样的,每个人的盐不一样, 首先引入工具包,lambdaworks <!-- https://mvnrepository. ...
- haproxy高可用、负载均衡集群
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G的并发.另外其支持从4层至7层的网络交换, ...
- 123457123456#0#-----com.ppGame.huaHua65--前拼后广--儿童填色-pp
com.ppGame.huaHua65--前拼后广--儿童填色-pp
- Linux查找含有特定字符串的文件
Linux查找含有特定字符串的文件命令为grep.以下为详细的使用方法 grep [OPTIONS] PATTERN [FILE...] #实例:递归查找当前文件夹下所有含有test的文件,并显示行号 ...
- Yii2打印原始sql语句
$query = User::find() ->where(['id'=>[1,2,3,4]) ->select(['username']) // get the AR raw sq ...
- 神啊,看看Log4Net这个东西吧
这个东西实在是让人感动的想哭囊…………-_-..... Log4Net.config文件 <?xml version="1.0" encoding="utf-8&q ...