问题来历如下:

蔚来手撕代码题:三个线程循环打印ABC

思路剖析

三个线程交替打印 ABC 的完成方法有许多,我个人比较倾向于使用 JUC 下的 CyclicBarrier(循环栅门,也叫循环屏障)来完成,由于循环栅门天生便是用来完成一轮一轮多线程使命的,它的中心完成思路如下图所示:

蔚来手撕代码题:三个线程循环打印ABC
CyclicBarrier 作用是让一组线程相互等候,当达到一个共同点时,所有之前等候的线程再持续履行,且 CyclicBarrier 功用可重复使用。
蔚来手撕代码题:三个线程循环打印ABC
上图描绘的便是 CyclicBarrier 每轮等候 5 个线程悉数达到一个共同点时,再履行下一阶段的使命。

举个比如

比如磊哥要坐班车回老家,由于中途不允许上、下乘客,那么营运的公司为了收益最大化,就会等人满之后再发车,这个发车的触发条件便是 CyclicBarrier 中多个线程履行的共同点。等汽车达到另一个站点之后也是相同的操作,等候乘客再次坐满之后,再持续发车,CyclicBarrier 便是这样履行的,它也是可以循环使用的。

完成代码

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
 * 3 个线程交替打印 ABC
 */
public class ThreadLoopPrint {
    // 共享计数器
    private static int sharedCounter = 0;
    public static void main(String[] args) {
        // 打印的内容
        String printString = "ABC";
        // 界说循环栅门
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
        });
        // 履行使命
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < printString.length(); i++) {
                    synchronized (this) {
                        sharedCounter = sharedCounter > 2 ? 0 : sharedCounter; // 循环打印
                        System.out.println(printString.toCharArray()[sharedCounter++]);
                    }
                    try {
                        // 等候 3 个线程都打印一遍之后,持续走下一轮的打印
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        // 敞开多个线程
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
    }
}

以上程序履行的成果如下图所示:

蔚来手撕代码题:三个线程循环打印ABC

小结

多线程循环打印主要是调查应聘者对于多线程模块把握的状况,经过应聘者编写的代码和编写代码所用的时刻,可以十分直观的了解应聘者的代码基本功。


本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、规划形式、音讯队列等模块。