成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

蔚來手撕代碼題:三個線程循環打印ABC

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

問題如下:

圖片

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講》等。


責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2022-11-18 09:03:12

線程順序打印

2021-06-09 07:01:30

前端CallApply

2021-09-06 08:13:35

APM系統監控

2015-12-11 15:52:47

盛大云

2021-07-15 14:29:06

LRU算法

2022-07-15 08:52:10

代碼Java設計模式

2024-03-07 12:51:44

代碼CRUD數據

2024-08-28 11:10:53

2018-03-02 06:38:25

物聯網數字轉型區塊鏈

2020-06-11 09:00:27

SDN網絡架構網絡

2021-11-04 11:14:30

智能自動駕駛汽車

2021-05-18 07:52:31

PromiseAsyncAwait

2023-05-11 07:43:36

機器學習深度學習算法

2023-04-26 11:14:11

IT領導者遠程工作

2010-07-30 12:44:58

無線路由故障

2020-09-27 08:04:57

前端

2024-08-06 10:16:52

Java AgentJava

2024-12-03 16:49:58

2020-09-15 08:55:07

算法數據基礎

2020-09-17 14:04:32

拷貝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本精品在线观看 | 国产免费一区二区三区免费视频 | 视频一区二区三区在线观看 | 欧美亚洲国产一区二区三区 | 日本精品视频一区二区三区四区 | 91n成人 | 国产免国产免费 | 二区三区在线观看 | 天堂一区二区三区 | 精品日韩一区二区三区av动图 | 日本在线视 | 久久成人一区 | 福利二区 | 国产真实精品久久二三区 | 欧美aaaaaaaaaa| 九一国产精品 | 久久国内精品 | 国产成人网 | 国产这里只有精品 | 范冰冰一级做a爰片久久毛片 | 欧美一级免费看 | 色综合久久天天综合网 | 欧美精品福利 | 免费国产网站 | 99精品久久久国产一区二区三 | 亚洲一区二区电影在线观看 | 精品国产一区二区三区久久久蜜月 | 高清视频一区二区三区 | 亚洲成人精品一区二区 | 亚洲www啪成人一区二区 | 99久久久久国产精品免费 | 一级黄色片在线免费观看 | 欧美一级在线观看 | 国产精品久久久久久久久久久久冷 | 亚洲香蕉| 天堂在线www | 欧美综合久久久 | 最新免费黄色网址 | 久久精品久久久 | 中文字幕欧美在线观看 | 黄色一级片aaa |