首页 > 互联网

全球热点评!蔚来手撕代码题:三个线程循环打印ABC

来源:Java面试真题解析 时间:2023-06-25 12:01:28

问题如下:


(资料图片仅供参考)

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

大逆转!街拍不是随意的,而是小姐姐设下的游戏,董,胡总被骗了

中国农业发展银行总行专家委员会副主任委员赵富洲接受审查调查

她越裹越紧,在座各位都有责任 环球新视野

2023年吉林一级消防工程师报名网站入口及报考流程 环球热点评

多彩民俗点亮即墨古城|全球新动态

聚焦:特斯拉FSD暗藏彩蛋 “埃隆模式”

宜春学院2023年研究生一志愿复试时间安排

至少涨价1500元?iPhone 15备货量曝光:苹果出手近亿台

广东高考今日放榜 深圳中考明日开考

普里戈任接受白俄缓和局势建议 其刑事立案将获撤销 全球聚焦

印尼防疫放出狠招(澎湃新闻:印尼解除所有新冠防疫措施) 焦点观察

天天百事通!海南高考成绩公布!本科批普通类分数线483分

小米手机海边拍照参数_天天热议

中国国情:男子返岗女儿偷塞100元和卡片|焦点短讯

梁静茹演唱会观众齐喊开空调-全球要闻

U19男篮世界杯:中国队首战20分不敌法国 杨瀚森14+6+3

游客称160元买庐山门票看瀑布还要35元,当地回应:非庐山景区,目前已免费

精选!2023珠海香洲区幼儿园电脑派位结果在哪查?附查询入口

孔德京夺得中式台球国际精英赛冠军 世界视点

环球速看:宝可梦卡牌2023北京大师赛热血来袭 盛夏赛事再掀卡牌对战浪潮

环球热资讯!苏州地铁11号线沿途景点有哪些

四川汇语电子商务有限公司:抖音小店怎么做赚钱店铺?

丰田再次放大招,亮出SUV版卡罗拉,油耗5.4L,比本田CR-V还霸气

山东2023年高考录取分数线

【浅岚X恶灵】【同人】相交线/汇流 天天热讯

美国初请失业金人数意外小幅上升 连续三周高于26万|环球微速讯

十天可以瘦多少_十天可以瘦多少斤

端午假期旅游人次超疫情前 受高温影响夜间游人次占比提高

世界新消息丨3人往海里扔100多个粽子 网友:既不环保又浪费粮食