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

三个线程交替打印ABC

时间:2024-02-19 11:46:23浏览次数:24  
标签:index ABC Thread ++ lock 打印 InterruptedException 线程 catch

public class PrintABC {
    private static final Object lock = new Object();
    private static volatile Integer index = 0;
    private static final int count = 3;

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                synchronized (lock) {
                    while (index % count != 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {

                        }
                    }

                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {

                    }
                    System.out.print(i + "A");
                    index++;
                    lock.notifyAll();
                }
            }
        }, "a-thread");

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                synchronized (lock) {
                    while (index % count != 1) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {

                        }
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {

                    }
                    System.out.print("B");
                    index++;
                    lock.notifyAll();
                }
            }
        }, "b-thread");

        Thread t3 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                synchronized (lock) {
                    while (index % count != 2) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {

                        }
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {

                    }
                    System.out.print("C");
                    index++;
                    lock.notifyAll();
                }
            }
        }, "c-thread");
        t1.start();
        t2.start();
        t3.start();
    }

标签:index,ABC,Thread,++,lock,打印,InterruptedException,线程,catch
From: https://www.cnblogs.com/d9e84208/p/18020744

相关文章

  • Go循环打印cat-dog-fish。。。。。
    packagemainimport( "fmt" "sync")//三个协程交替打印catdogfishvarrepeatCount=10funcmain(){ //wg用来防止主协程提前先退出 wg:=&sync.WaitGroup{} wg.Add(3) chCat:=make(chanstruct{},1) chDog:=make(chanstruct{},1) chFis......
  • 多线程系列(二) -Thread类使用详解
    一、简介在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用CPU资源,显著的提升程序的执行效率。其中java.lang.Thread是Java实现多线程编程最核心的类,学习Thread类中的方法,是学习多线程的第一步。下面我们就一起来看看,创建线程的几种......
  • Redis为何快?Redis6/7版本为何要开始支持多线程?
    Redis之所以快,主要有以下几个原因:1.数据结构和内部编码:Redis提供了多种数据结构,如string、hash、list、set、zset等,这些数据结构都有对应的内部编码。根据存储的键值对的个数和大小,Redis会选择最合适的内部编码。这样的设计可以充分发挥各种数据结构的优势,提高性能。2.纯内......
  • 玩转CompletableFuture线程异步编排,看这一篇就够了
    转载自:https://blog.csdn.net/w306026355/article/details/1097072691、CompletableFuture介绍CompletableFuture可用于线程异步编排,使原本串行执行的代码,变为并行执行,提高代码执行速度。学习异步编排先需要学习线程池和lambda表达式相关知识,学习线程池可以移步我的另一篇博......
  • C# 多线程
    什么是线程线程是操作系统中能够独立运行的最小单位,也是程序中能够并发执行的一段指令序列。线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程的资源。进程有入口线程,也可以创建更多的线程。为什么要多线程批量重复任务希望同时进行多个不同任务希望同时进行......
  • 监控Java虚拟线程
    目录监控Java虚拟线程简介虚拟线程监控的具体细节跟踪牵制线程(pinnedthreads)我的框架如何使用虚拟线程?监控ForkJoinPool结论参考监控Java虚拟线程开发便利性与运行高效性简介在我之前的文章中,我们已经讨论了什么是虚拟线程(VTs),他们与物理线程(PTs)之间的区别,以及如......
  • 惠普HP519打印机缺色处理记录
    打印蓝色缺失开盖检查,发现蓝色墨水管路中间有断线,拆开打印头后,用随机器配的桔红色吸墨器吸墨.之后重新开机还是缺色.检查彩色打印头,用浅浅的一层热水泡下方喷嘴,黄色红色出墨明显,蓝色几乎没颜色,于是用针管从入口注入一些蓝色墨水,再用另一个针管拆掉针头后,套上......
  • 多线程系列(一) -线程技术入门知识讲解
    一、简介在很多场景下,我们经常听到采用多线程编程,能显著的提升程序的执行效率。例如执行大批量数据的插入操作,采用单线程编程进行插入可能需要30分钟,采用多线程编程进行插入可能只需要5分钟就够了。既然多线程编程技术如此厉害,那什么是多线程呢?在介绍多线程之前,我们还得先......
  • ABC341
    Elink这个题目中所说的好的其实就是像\(010101\)这样一个\(0\),一个\(1\)的字符串。那么不好的就是两个\(0\)或两个\(1\)在一起,所以判断一个区间好不好只需要判断一个区间内有没有两个\(0\)或两个\(1\)在一起,那么我们可以把两个\(0\)或两个\(1\)在一起的位置存下来。先考虑查......
  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......