Java 多线程 不使用锁机制 实现交替打印数字和字母

Java 多线程 不使用锁机制 实现交替打印数字和字母

        这是一道经典的面试题,使用两个线程去交替打印数字和字母,输出1A2B3C4D5E6F7G…这样的效果,看了网上很多的文章,基本都是使用Condition、阻塞队列、多线程的锁机制之类的方法去实现,那么像我这样刚接触多线程的萌新,在对大佬们?说的这些东西还不是很了解的情况下,不使用多线程的锁机制,如何去解决这个问题呢?这里主要用到了while的死循环来代替wait()和notify()的效果。


简单说一下我这里的思路:
  1. 多个线程间共享的数据称为临界资源,这里我们使用一个布尔类型的静态成员变量flag,通过其状态控制两个线程的输出;
  2. 两个子线程,一个打印数字,一个打印字母;
  3. 若当flag为true时打印数字,flag为false时打印字母,因为两个线程是同时进行的,则当flag为true时,我们要让打印字母的线程进入等待状态,这里我们让其进入死循环状态,打印数字的线程开始打印数字,并改变flag的状态。与此相同,当flag为false时,打印字母的线程开始工作,打印数字的线程进入“等待”状态。
  4. 每打印一次就改变一次flag的状态值,这样便实现了交替打印的效果。

下面是代码以及输出结果:

public class Test2 {
    //临界资源
    private static boolean flag = true;

    public static void main(String[] args) {
        Thread thread = new Thread(new PrintNum());
        //启动线程
        thread.start();
        
        //打印字母的线程
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            //flag为true时进入死循环
            while (flag) {

            }
            //flag为false时打印字母
            System.out.print(ch);
            //每打印一次,改变一次状态值
            flag = !flag;
        }

    }

    /**
     * 打印数字的线程
     */
    static class PrintNum implements Runnable {
        @Override
        public void run() {
            for (int i = 1; i <= 26; i++) {
                //flag为false时进入死循环
                while (!flag) {

                }
                //flag为true时打印数字
                System.out.print(i);
                flag = !flag;
            }
        }
    }
    
}

输出结果:


       最后说明一下,因为是使用while的死循环去实现线程的等待状态,如果线程较多,可能会出现问题,只是两个线程的话还是没有问题的,还有就是这里的线程“等待”期间,依然还是在占用系统的资源。所以还是不推荐使用这种方法。?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值