失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 多线程面试题之【三线程按顺序交替打印ABC的方法】

多线程面试题之【三线程按顺序交替打印ABC的方法】

时间:2022-03-08 07:56:20

相关推荐

多线程面试题之【三线程按顺序交替打印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 /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的方法】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。