自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

蔚來手撕代碼題:三個線程循環(huán)打印ABC

開發(fā) 前端
多線程循環(huán)打印主要是考察應(yīng)聘者對于多線程模塊掌握的情況,通過應(yīng)聘者編寫的代碼和編寫代碼所用的時間,可以非常直觀的了解應(yīng)聘者的代碼基本功。

問題如下:

圖片

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

思路分析

三個線程交替打印 ABC 的實現(xiàn)方法有很多,我個人比較傾向于使用 JUC 下的 CyclicBarrier(循環(huán)柵欄,也叫循環(huán)屏障)來實現(xiàn),因為循環(huán)柵欄天生就是用來實現(xiàn)一輪一輪多線程任務(wù)的,它的核心實現(xiàn)思路如下圖所示:

圖片

CyclicBarrier 作用是讓一組線程相互等待,當(dāng)達(dá)到一個共同點時,所有之前等待的線程再繼續(xù)執(zhí)行,且 CyclicBarrier 功能可重復(fù)使用。

圖片

上圖描述的就是 CyclicBarrier 每輪等待 5 個線程全部達(dá)到一個共同點時,再執(zhí)行下一階段的任務(wù)。

舉個例子

比如磊哥要坐班車回老家,因為中途不允許上、下乘客,那么營運的公司為了收益最大化,就會等人滿之后再發(fā)車,這個發(fā)車的觸發(fā)條件就是 CyclicBarrier 中多個線程執(zhí)行的共同點。等汽車達(dá)到另一個站點之后也是同樣的操作,等待乘客再次坐滿之后,再繼續(xù)發(fā)車,CyclicBarrier 就是這樣執(zhí)行的,它也是可以循環(huán)使用的。

實現(xiàn)代碼

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 3 個線程交替打印 ABC
 */
public class ThreadLoopPrint {
    // 共享計數(shù)器
    private static int sharedCounter = 0;
    public static void main(String[] args) {
        // 打印的內(nèi)容
        String printString = "ABC";
        // 定義循環(huán)柵欄
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
        });
        // 執(zhí)行任務(wù)
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < printString.length(); i++) {
                    synchronized (this) {
                        sharedCounter = sharedCounter > 2 ? 0 : sharedCounter; // 循環(huán)打印
                        System.out.println(printString.toCharArray()[sharedCounter++]);
                    }
                    try {
                        // 等待 3 個線程都打印一遍之后,繼續(xù)走下一輪的打印
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        // 開啟多個線程
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
    }
}

以上程序執(zhí)行的結(jié)果如下圖所示:

圖片

小結(jié)

多線程循環(huán)打印主要是考察應(yīng)聘者對于多線程模塊掌握的情況,通過應(yīng)聘者編寫的代碼和編寫代碼所用的時間,可以非常直觀的了解應(yīng)聘者的代碼基本功。

作者介紹

王磊(人稱磊哥),13 年一線編程工作經(jīng)驗,3 年授課經(jīng)驗,曾就職于 360,資深技術(shù)博主。曾擔(dān)任某思教育和某谷電商的研發(fā)經(jīng)理和技術(shù)負(fù)責(zé)人。

Java 技術(shù)傳播者,博客總閱讀量近 300 萬次,博客成就:騰訊云年年度最佳作者/掘金社區(qū)優(yōu)秀作者/拉勾專欄作者/GitChat(CSDN 旗下)暢銷作家/慕課講師/阿里云社區(qū)技術(shù)專家等,發(fā)布了 6 個技術(shù)專欄,分別是拉勾平臺的《Java大廠真題與源碼34講》,GitChat 平臺的《Java 面試全解析:核心知識點與典型面試題》《程序員的 MySQL 面試金典》《Redis 核心原理與實戰(zhàn)》《程序員的 Redis 面試金典》,慕課網(wǎng)的《設(shè)計模式深度解析34講》等。


責(zé)任編輯:武曉燕 來源: Java面試真題解析
相關(guān)推薦

2022-11-18 09:03:12

線程順序打印

2021-06-09 07:01:30

前端CallApply

2021-07-15 14:29:06

LRU算法

2015-12-11 15:52:47

盛大云

2021-09-06 08:13:35

APM系統(tǒng)監(jiān)控

2022-07-15 08:52:10

代碼Java設(shè)計模式

2024-08-28 11:10:53

2024-03-07 12:51:44

代碼CRUD數(shù)據(jù)

2018-03-02 06:38:25

物聯(lián)網(wǎng)數(shù)字轉(zhuǎn)型區(qū)塊鏈

2020-06-11 09:00:27

SDN網(wǎng)絡(luò)架構(gòu)網(wǎng)絡(luò)

2021-05-18 07:52:31

PromiseAsyncAwait

2021-11-04 11:14:30

智能自動駕駛汽車

2010-07-30 12:44:58

無線路由故障

2023-04-26 11:14:11

IT領(lǐng)導(dǎo)者遠(yuǎn)程工作

2024-08-06 10:16:52

Java AgentJava

2023-05-11 07:43:36

機器學(xué)習(xí)深度學(xué)習(xí)算法

2020-09-27 08:04:57

前端

2023-10-18 17:49:58

數(shù)據(jù)結(jié)構(gòu)隊列結(jié)構(gòu)

2023-06-26 08:06:39

重構(gòu)代碼冗余

2020-09-15 08:55:07

算法數(shù)據(jù)基礎(chǔ)
點贊
收藏

51CTO技術(shù)棧公眾號