Java多线程面试题: 交叉打印数字与字母

该博客介绍了一个Java编程题目,涉及多线程同步。通过两个线程,线程1打印数字1到26,线程2交替打印字母A到Z,实现了交错输出1A2B3C...25Y26Z的效果。主要使用了volatile关键字确保可见性,synchronized保证互斥,并用wait/notify进行线程间的通信。
摘要由CSDN通过智能技术生成

面试题一道: 使用两个线程交叉打印字母和数字, 形式如下所示
线程1: 输出1
线程2: 输出A
线程1: 输出2
线程2: 输出B

线程1: 输出25
线程2: 输出Y
线程1: 输出26
线程2: 输出Z

逻辑思路见程序注释

/**
 * 功能说明:打印字母和数字
 * 1A2B3C4D...25Y26Z
 * 开发人员:@Author MaLi
 */
public class T10_PrintAB {
	// volatile修饰一下index, 在高并发场景下, 保证线程彼此可见性和CPU指令的有序性
    private volatile int index = 0;
    private final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public synchronized void printChars() {
        // 按照指针从0到25, 打印chars中的每一个字母
        while (index <= 25) {
            //1, 打印字母
            System.out.println("ThreadNo:" + Thread.currentThread().getName() + "-->" + chars.charAt(index++));
            // 2, 打印完成通知另一个线程开始打印数字
            notify();
            try {
                // 3, 释放锁
                wait();
                // 4, 如果到了chars的边界位置, 跳出当前循环, 线程任务结束
                if (index == 26) { //由于上面有了一次index++, 所以让index走到边界的时候, 直接退出循环就可以了, 没有必要wait()释放锁
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void printInteger() {
        //
        while (true) {
            // 1,打印数字
            System.out.println("ThreadNo:" + Thread.currentThread().getName() + "-->" + (index + 1));
            //2, 打印完成, 通知另一个线程
            notify();
            try {
                // 3, 释放锁, 等待被唤醒, 此时另外一个线程可以得到锁
                wait();
                //4, 当边界到达26的时候, 跳出当前循环, 线程任务结束
                if (index == 26) {
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        T10_PrintAB instance = new T10_PrintAB();
        new Thread(instance::printInteger, "Thread_02").start();
        new Thread(instance::printChars, "Thread_01").start();
    }
}

LoveCoding, KeepCoding, EnjoyCoding. Mark

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能力工场小马哥

如果对您有帮助, 请打赏支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值