三个线程顺序打印ABC,各打印10次

        也是面试被问到的题,通过ReentrantLock实现了下,自己测试了下没有问题,crud几年,对多线程了解太少,有不足的地方请大神们指正,有更好的方法也请大神们指导!

实现思路

创建3个线程,并且给3个线程编号,通过对3取模来判断是否轮到当前线程打印,且通过线程编号来判断应该打印哪个字母

代码实现

/**
 * 三个线程顺序打印ABC,各打印10次
 *
 * @author xxx
 * @date 2021/4/25
 */
public class SynchronizedAbc {
    //通过Lock锁来保证线程的访问的互斥
    private static Lock lock = new ReentrantLock();

    //通过state的值对线程数量(本例子用的是3个线程)取模跟线程编号对比,来确定是否是该线程进行打印
    private static int state = 0;

    //线程数量
    private static int threadCount = 3;

    public static void main(String[] args) {
        //创建 三个线程并start开启线程,分别传进去线程编号
        new MyThread(0).start();
        new MyThread(1).start();
        new MyThread(2).start();
    }

    static class MyThread extends Thread {
        //线程编号,很重要,用来确定该线程应该打印哪个字母
        private int threadNum;

        //空构造
        public MyThread() {

        }

        //构造函数
        public MyThread(int threadNum) {
            this.threadNum = threadNum;
        }

        @Override
        public void run() {
            //定义i=0,while循环进行循环10次操作
            int i = 0;
            while (i < 10) {
                //try finally進行unlock操作
                try {
                    //线程进来,锁空闲的话,获得锁
                    lock.lock();

                    //递增的state,state取模,判断是否该当前线程打印
                    while (state % threadCount == this.threadNum) {
                        //进行判断,0号线程打印A,1号线程打印B,2号线程打印C
                        if (threadNum == 0) {
                            System.out.println(this.threadNum + "==A");
                        } else if (threadNum == 1) {
                            System.out.println(this.threadNum + "==B");
                        } else if (threadNum == 2) {
                            System.out.println(this.threadNum + "==C");
                        }

                        //state值+1,每次线程进来打印一个字母后,state值+1,
                        state++;
                        //i++操作是为了打印10次后,跳出最外层while循环
                        i++;
                    }
                } finally {
                    // 释放锁,unlock()操作放在finally块中,保证最后肯定会释放锁
                    lock.unlock();
                }
            }
        }
    }
}

结果打印

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你认识小汐吗

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值