首页 > 其他分享 >多线程交替打印ABC

多线程交替打印ABC

时间:2024-12-15 13:21:47浏览次数:5  
标签:多线程 int lock 打印 ABC Semaphore catch new threadABC1

开启3个线程,依次交替打印ABC,打印5轮

一、使用Lock+Condition来实现

public class ThreadABC {
    private volatile int number = 1;
    private Lock lock = new ReentrantLock();
    private Condition c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();


    public void printA() {
        lock.lock();
        try {
            while (number != 1) {
                //使当前线程释放锁,暂时wait挂起,直到下次被signal后唤醒
                c1.await();
            }
            System.out.println("A");
            number = 2;
            //唤醒c2
            c2.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void printB() {
        lock.lock();
        try {
            while (number != 2) {
                c2.await();
            }
            System.out.println("B");
            number = 3;
            c3.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void printC() {
        lock.lock();
        try {
            while (number != 3) {
                c3.await();
            }
            System.out.println("C");
            number = 1;
            c1.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ThreadABC threadABC = new ThreadABC();
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                threadABC.printA();
            }
        }, "1").start();
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                threadABC.printB();
            }
        }, "2").start();
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                threadABC.printC();
            }
        }, "3").start();
    }
}

二、使用Semaphore实现

class ThreadABC1 {

    Semaphore s1 = new Semaphore(1);
    Semaphore s2 = new Semaphore(1);
    Semaphore s3 = new Semaphore(1);

    public static void main(String[] args) {
        ThreadABC1 threadABC1 = new ThreadABC1();
        try {
            threadABC1.s2.acquire();
            threadABC1.s3.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    //acquire成功后,许可数量减一
                    //如果acquire不成功,持有该信号量的当前线程就会处于休眠状态
                    threadABC1.s1.acquire();
                    System.out.println("A");
                    //release之后,持有该信号量的线程就会被唤醒
                    threadABC1.s2.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

        new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    threadABC1.s2.acquire();
                    System.out.println("B");
                    threadABC1.s3.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

        new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    threadABC1.s3.acquire();
                    System.out.println("C");
                    threadABC1.s1.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();
    }
}

  

标签:多线程,int,lock,打印,ABC,Semaphore,catch,new,threadABC1
From: https://www.cnblogs.com/damour-damocles/p/18606978

相关文章

  • ABC 384 F
    ABC384Fabc经典EF出式子题。问题陈述对于正整数\(x\),定义\(f(x)\)如下:"当\(x\)是偶数时,继续除以\(2\)。经过这些除法后,\(x\)的最终值为\(f(x)\)"。例如,\(f(4)=f(2)=f(1)=1\)和\(f(12)=f(6)=f(3)=3\)。已知长度为\(N\)的整数序列\(A=(A_1,A_2,\ldots,A......
  • AT_kupc2019_g ABCのG問題题解
    这题的难度不怎么好说,不过我认为还是挺简单的。我们可以把答案看成由多个子图构成的图,这样我们只需要手打一个小子图,从中推出完整的答案。-把小于子图范围的地方填上子图的字母-如果这个点的横坐标或纵坐标小于子图范围就填上$T_{i,0}$或$T_{0,j}$详见注释intmain(){......
  • [20241212]Oracle 多线程测试.txt
    [20241212]Oracle多线程测试.txt--//oracle从12c版本开始支持多线程,各种原因从来没有测试,好像最近很少有人提及,或许使用oracle的人越来越少,或者许多人根--//本没有这样的需求,印象最深的是启用后必须使用口令登录,即使是sys用户.--//自己还是看一些文章,测试看看。1.环境:SYS@book>@......
  • [20241214]Oracle 多线程测试(补充).txt
    [20241214]Oracle多线程测试(补充).txt--//补充测试altersystemkillsession'sid,serial#'immediate;杀线程的情况是否可行。1.环境:SYS@book>@ver2==============================PORT_STRING                  :x86_64/Linux2.4.xxVERSION     ......
  • Java——多线程(下)
    一(线程同步)1线程冲突和同步(有线程冲突——>通过线程同步解决——>并行化转换成线性化)(线程同步——>一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用)1.1线程冲突可能动作一刚改完名字,时间片......
  • 【杂谈】后台日志该怎么打印
    为什么要打印日志?1.监控系统运行情况定期查看系统日志是了解服务是否正常运行的重要手段。日志为运维人员提供了实时监控系统状态、发现潜在问题的关键信息。2.排查问题(例如异常栈)日志记录了详细的错误信息,特别是异常栈,有助于快速定位问题的根源。对于一些偶发的Bug,日志是......
  • 多线程与线程互斥
    目录引言一、多线程设计多线程模拟抢票二、互斥锁互斥量的接口修改抢票代码锁的原理锁的封装:RAII引言随着信息技术的飞速发展,计算机软件正变得越来越复杂,对性能和响应速度的要求也日益提高。在这样的背景下,多线程编程作为一种提高程序执行效率和资源利用率的技术,......
  • 5、多线程-按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印 15 次,重复 10 次
    题目多线程按顺序调用,A->B->C,AA打印5次,BB打印10次,CC打印15次,重复10次代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassABCPrinter{ privateintrepeatCount; privateintaPrintCount; privateintbPrintCount; ......
  • 4、多线程-通过 N 个线程顺序循环打印从 0 至 100
    题目通过N个线程顺序循环打印从0至100代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassZeroEvenOdd{ privateintn=100; privateAutoResetEventzeroEvent=newAutoResetEvent(true);//一开始zero可以运行 pri......
  • 3、多线程-两个线程交替打印 0~100 的奇偶数
    题目两个线程交替打印0~100的奇偶数代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassZeroEvenOdd{ privateintn=100; privateAutoResetEventevenEvent=newAutoResetEvent(false); privateAutoResetEventoddEvent......