JAVA 线程循环打印的几种方法 3个线程 循环打印ABC 10次

在面试中遇到了这个问题 ,这个问题主要考面试者的多线程相关的知识,包括但不限于wait/notify 锁 Volatile变量3个方面。

3个线程 循环打印ABC 10次

第一种实现 Volatile 实现 依靠共同的state变量来保证 需要轮询


public class ThreadForDemo {
    private static volatile int threestate=0;
    static class MyThread extends Thread{
        int state;
        MyThread(int state){
            this.state = state;
        }
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                    while (true){
                        if(threestate%3==state){
                            break;
                        }
                    }
                    System.out.println((char)('A'+state));
                    threestate++;
            }

        }
    }
    public static void main(String[] args) {
        MyThread one = new MyThread(0);
        MyThread two = new MyThread(1);
        MyThread three = new MyThread(2);
        one.start();
        two.start();
        three.start();
    }
}

第二种实现 基于 wait/notify范式来实现

wait/ notify 基本上是这样的

while(条件不成立){
obj.wait();
}
obj.notifyall();

具体实现如下 利用共同的obj 来达到控制的目的 速度比较慢

public class ThreadForDemo {
    static class MyThread implements Runnable {
        Printer printer;
        char words='A';

        public MyThread(Printer printer, char words) {
            this.printer = printer;
            this.words = words;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                synchronized (printer){
                    while(words!= printer.getWords()){
                        try {
                            printer.wait();
                        }catch (Exception e){
                            e.printStackTrace();
                        }

                    }
                    printer.print();
                    printer.next();
                    printer.notifyAll();
                }
            }
        }
    }
    static class Printer {
        char words = 'A';
        void print(){
            System.out.println(words);
        }
        void next(){
            switch (words){
                case 'A': words = 'B';
                break;
                case 'B': words = 'C';
                break;
                case 'C': words = 'A';
                break;
            }
        }
        char getWords(){
            return words;
        }
    }
    public static void main(String[] args) {
        Printer printer = new Printer();
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.execute(new MyThread(printer,'A'));
        executorService.execute(new MyThread(printer,'B'));
        executorService.execute(new MyThread(printer,'C'));
        executorService.shutdown();
    }
}

利用 JUC 中的condition 来完成 和 wait / notify方法差不多的效果 区别在与Condition 可以创建多个

public class ThreadForDemo {
    ReentrantLock lock = new ReentrantLock();
    Condition conditionA = lock.newCondition();
    Condition conditionB = lock.newCondition();
    Condition conditionC = lock.newCondition();
    int commonstate = 0;
    class MyThread implements  Runnable{
        int state;

        public MyThread(int state) {
            this.state = state;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                lock.lock();
                try {
                    switch (state){
                        case 0 :{
                            while (commonstate!=0){
                                conditionA.await();
                            }
                            System.out.println((char)('A'+state));
                            commonstate=1;
                            conditionB.signal();
                            break;
                        }
                        case 1:{
                            while (commonstate!=1){
                                conditionB.await();
                            }
                            System.out.println((char)('A'+state));
                            commonstate=2;
                            conditionC.signal();
                            break;
                        }
                        case 2:{
                            while (commonstate!=2){
                                conditionC.await();
                            }
                            System.out.println((char)('A'+state));
                            commonstate=0;
                            conditionA.signal();
                            break;
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }

            }
        }
    }
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        ThreadForDemo threadForDemo = new ThreadForDemo();
        executorService.execute(threadForDemo.new MyThread(0));
        executorService.execute(threadForDemo.new MyThread(1));
        executorService.execute(threadForDemo.new MyThread(2));
        executorService.shutdown();
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355