三个线程顺序打印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();
                }
            }
        }
    }
}

结果打印

可以使用信号量来实现线程的同步,代码如下: ```python import threading class ABCPrinter: def __init__(self): self.sem_a = threading.Semaphore(1) self.sem_b = threading.Semaphore(0) self.sem_c = threading.Semaphore(0) def print_a(self): for i in range(10): self.sem_a.acquire() print('A', end='') self.sem_b.release() def print_b(self): for i in range(10): self.sem_b.acquire() print('B', end='') self.sem_c.release() def print_c(self): for i in range(10): self.sem_c.acquire() print('C', end='') self.sem_a.release() printer = ABCPrinter() thread_a = threading.Thread(target=printer.print_a) thread_b = threading.Thread(target=printer.print_b) thread_c = threading.Thread(target=printer.print_c) thread_a.start() thread_b.start() thread_c.start() thread_a.join() thread_b.join() thread_c.join() ``` 每个线程都会通过 acquire() 方法等待信号量,当信号量的值大于 0 时,线程会继续执行,同时将信号量的值减 1。当线程执行完任务后,会通过 release() 方法将信号量的值加 1。在这个例子中,每个线程都有一个信号量,用来控制打印顺序。初始时,A 线程的信号量为 1,B 和 C 线程的信号量为 0,因此 A 线程会先执行。当 A 线程打印完后,会将 B 线程的信号量加 1,然后等待自己的信号量被释放。B 线程接着执行,打印完后将 C 线程的信号量加 1,然后等待自己的信号量被释放。C 线程接着执行,打印完后将 A 线程的信号量加 1,然后等待自己的信号量被释放。依此类推,直到所有线程打印了十才结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你认识小汐吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值