两个线程交替打印

这是一个关于Java线程面试题的解析,题目要求两个线程轮流打印数字,线程1打印1、2、3,线程2打印4、5、6,直到达到指定数值(如100)。文章介绍了作者时隔多年后重新实现该问题的过程,以此巩固线程的有序性概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久之前遇到的一个面试题,要求是指定一个数值(如100),线程1打印1、2、3,线程2打印4、5、6,如此反复,到指定数值(100)时程序结束,当时并没有做出来,回来之后在网上查看了些博客,也有了思路,虽然也做出来了,但并没有完全领会,今天看到线程的有序性,事隔多年,自己又动手实现了一次,也夯实了一下基础知识。话不多说,上代码  ^_^

public class ThreadAlternatePrint extends Thread{
    private Object lock;
    private static final Integer counter = 100;
    private volatile static boolean execFlag = false;
    private int printCount=0;
    private volatile static int addNumber=1;

    public ThreadAlternatePrintDemoExt(Object lock) {
        this.lock = lock;
    }
    @Override
    public void run() {
        try {
            synchronized (lock){
                while (addNumber <= counter){
                    if (!execFlag) {
                        if (addNumber > counter) {
                            return;
                        }
                        System.out.println(Thread.currentThread().getName() + " 打印 " + addNumber);
                        lock.notify();
                        printCount++;
                        addNumber++;
                        execFlag = false;
                        if (printCount == 3) {
                            execFlag = true;
                            printCount = 0;
                            lock.wait();
                        }
                    }

                    if (execFlag) {
                        if (addNumber > counter) {
                            return;
                        }
                        System.out.println(Thread.currentThread().getName() + " 打印 " + addNumber);
                        lock.notify();
                        printCount++;
                        addNumber++;
                        execFlag=true;
                        if (printCount == 3) {
                            execFlag = false;
                            printCount = 0;
                            lock.wait();
                        }
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Object lock = new Object();
        ThreadAlternatePrint t = new ThreadAlternatePrint(lock);
        ThreadAlternatePrint t1 = new ThreadAlternatePrint(lock);

        t.start();
        t1.start();
    }
}

实现的效果如下:

Thread-0 打印 1
Thread-0 打印 2
Thread-0 打印 3
Thread-1 打印 4
Thread-1 打印 5
Thread-1 打印 6
Thread-0 打印 7
Thread-0 打印 8
Thread-0 打印 9
Thread-1 打印 10
Thread-1 打印 11
Thread-1 打印 12
Thread-0 打印 13
Thread-0 打印 14
Thread-0 打印 15
Thread-1 打印 16
Thread-1 打印 17
Thread-1 打印 18
Thread-0 打印 19
Thread-0 打印 20
Thread-0 打印 21
Thread-1 打印 22
Thread-1 打印 23
Thread-1 打印 24
Thread-0 打印 25
Thread-0 打印 26
Thread-0 打印 27
Thread-1 打印 28
Thread-1 打印 29
Thread-1 打印 30
Thread-0 打印 31
Thread-0 打印 32
Thread-0 打印 33
Thread-1 打印 34
Thread-1 打印 35
Thread-1 打印 36
Thread-0 打印 37
Thread-0 打印 38
Thread-0 打印 39
Thread-1 打印 40
Thread-1 打印 41
Thread-1 打印 42
Thread-0 打印 43
Thread-0 打印 44
Thread-0 打印 45
Thread-1 打印 46
Thread-1 打印 47
Thread-1 打印 48
Thread-0 打印 49
Thread-0 打印 50
Thread-0 打印 51
Thread-1 打印 52
Thread-1 打印 53
Thread-1 打印 54
Thread-0 打印 55
Thread-0 打印 56
Thread-0 打印 57
Thread-1 打印 58
Thread-1 打印 59
Thread-1 打印 60
Thread-0 打印 61
Thread-0 打印 62
Thread-0 打印 63
Thread-1 打印 64
Thread-1 打印 65
Thread-1 打印 66
Thread-0 打印 67
Thread-0 打印 68
Thread-0 打印 69
Thread-1 打印 70
Thread-1 打印 71
Thread-1 打印 72
Thread-0 打印 73
Thread-0 打印 74
Thread-0 打印 75
Thread-1 打印 76
Thread-1 打印 77
Thread-1 打印 78
Thread-0 打印 79
Thread-0 打印 80
Thread-0 打印 81
Thread-1 打印 82
Thread-1 打印 83
Thread-1 打印 84
Thread-0 打印 85
Thread-0 打印 86
Thread-0 打印 87
Thread-1 打印 88
Thread-1 打印 89
Thread-1 打印 90
Thread-0 打印 91
Thread-0 打印 92
Thread-0 打印 93
Thread-1 打印 94
Thread-1 打印 95
Thread-1 打印 96
Thread-0 打印 97
Thread-0 打印 98
Thread-0 打印 99
Thread-1 打印 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值