全球熱點評!蔚來手撕代碼題:三個線程循環打印ABC
時間: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講》等。
相關稿件
大逆轉!街拍不是隨意的,而是小姐姐設下的游戲,董,胡總被騙了
2023年吉林一級消防工程師報名網站入口及報考流程 環球熱點評
至少漲價1500元?iPhone 15備貨量曝光:蘋果出手近億臺
印尼防疫放出狠招(澎湃新聞:印尼解除所有新冠防疫措施) 焦點觀察
U19男籃世界杯:中國隊首戰20分不敵法國 楊瀚森14+6+3
游客稱160元買廬山門票看瀑布還要35元,當地回應:非廬山景區,目前已免費
精選!2023珠海香洲區幼兒園電腦派位結果在哪查?附查詢入口
環球速看:寶可夢卡牌2023北京大師賽熱血來襲 盛夏賽事再掀卡牌對戰浪潮
豐田再次放大招,亮出SUV版卡羅拉,油耗5.4L,比本田CR-V還霸氣