全球观点:蔚来手撕代码题:三个线程循环打印ABC
时间:2023-06-26 07:03:17来源:清一色财经

多线程循环打印主要是考察应聘者对于多线程模块掌握的情况,通过应聘者编写的代码和编写代码所用的时间,可以非常直观的了解应聘者的代码基本功。

问题如下:


(资料图)

https://www.nowcoder.com/discuss/493178141461041152

思路分析

三个线程交替打印 ABC 的实现方法有很多,我个人比较倾向于使用 JUC 下的 CyclicBarrier(循环栅栏,也叫循环屏障)来实现,因为循环栅栏天生就是用来实现一轮一轮多线程任务的,它的核心实现思路如下图所示:

CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用。

上图描述的就是 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();    }}

以上程序执行的结果如下图所示:

小结

多线程循环打印主要是考察应聘者对于多线程模块掌握的情况,通过应聘者编写的代码和编写代码所用的时间,可以非常直观的了解应聘者的代码基本功。

作者介绍

王磊(人称磊哥),13 年一线编程工作经验,3 年授课经验,曾就职于 360,资深技术博主。曾担任某思教育和某谷电商的研发经理和技术负责人。

Java 技术传播者,博客总阅读量近 300 万次,博客成就:腾讯云年年度最佳作者/掘金社区优秀作者/拉勾专栏作者/GitChat(CSDN 旗下)畅销作家/慕课讲师/阿里云社区技术专家等,发布了 6 个技术专栏,分别是拉勾平台的《Java大厂真题与源码34讲》,GitChat 平台的《Java 面试全解析:核心知识点与典型面试题》《程序员的 MySQL 面试金典》《Redis 核心原理与实战》《程序员的 Redis 面试金典》,慕课网的《设计模式深度解析34讲》等。

标签:

最新
  • 全球观点:蔚来手撕代码题:三个线程循环打印ABC

    多线程循环打印主要是考察应聘者对于多线程模块掌握的情况,通过应聘者

  • 【世界独家】福宁重工建造新能源游船“大金湖2号”正式开工

    福宁重工建造新能源游船“大金湖2号”正式开工

  • 当前视点!2023重庆沙坪坝中考成绩查询时间+系统入口

    ▶“联招”成绩查询时间6月25日(星期日)14:00查询渠道网址:zzxx cqe

  • 河北省邯郸市市场监管局开展质量认证入企帮扶活动 当前播报

    6月20日至21日,河北省邯郸市市场监管局组织开展了质量认证入企帮扶活

  • AI画神器Midjourney更新

    机器之心报道编辑:杜伟这次,Midjourney5 2又给用户带来了新的惊喜!

  • 迪拜塔高度多少米?迪拜塔是世界第一高塔吗?

    迪拜塔高度多少米?迪拜塔高828米。迪拜塔位于阿拉伯联合酋长国的管

  • 快乐8第23166期森伯预测:热度胆码|世界即时看

    唯彩看球分享快乐8第23166期森伯预测,查看专家精选胆码、走势图、开奖

  • 50万大额存单利率4.05%多少利息?大额存单怎么存划算?-天天快资讯

    50万大额存单利率4 05%多少利息?大额存单怎么存划算?以下是小编为您

  • 全球快消息!河南南阳:小艾草长成“富民草”“幸福草”

    端午至,艾草香。在河南省南阳市邓州市张村镇的艾草产业园里,头茬艾草

  • 常见主板进入bios的方法(主板进入bios的方法virtual)|全球微速讯

    您好,现在蔡蔡来为大家解答以上的问题。常见主板进入bios的方法,主板

  • 哈巴狗比喻什么人造句 哈巴狗比喻什么人

    1、过街鼠(比喻人人痛恨的坏人)替罪羊(比喻代人受过,替人挨揍的人)变

  • 如何以歌声展现少年风貌?《我中国少年》有话说

    点映礼现场,河北广播电视台(集团)党委委员、副总经理、河北卫视总监

  • 陕西省2023年高考分数线公布:一本文科489分 一本理科443分_全球今日讯

    (记者 阿琳娜)24日,2023年全国普通高等学校招生陕西省各批次录

  • 北约导弹穿透俄防空网,现场升起巨大蘑菇云,这一仗让中国警醒!

    由于俄军不具备实时的大规模的SEAD DEAD作战能力,不能够及时准确地从

  • 全球今日讯!5月空调数据简评:出货零售双线回暖

    5月空调数据简评:出货零售双线回暖

  • 《县委大院》《人世间》分获白玉兰原创及改编最佳编剧奖

    最佳编剧奖(改编)由《人世间》编剧王海鸰、王大鸥获得

  • 旅游
    • 每日信息:IPO和上市有什么区别?ipo上市需要什么条件?上市对员工有什么好处?

    • 天天观天下!新鲜芦荟怎么做面膜 芦荟加什么敷脸最好?

    • 院线电影《申纪兰》定档6月28日 金鸡奖最佳女主角演绎传奇一生

    • 打造完整的产业链条 河南仙佑降低成本提升效益-聚焦