首页 > 其他分享 >随笔(二十五)『3个线程交替输出1-100、交替输出ABC』

随笔(二十五)『3个线程交替输出1-100、交替输出ABC』

时间:2023-07-19 15:11:25浏览次数:41  
标签:print1 输出 ABC Thread param printA 交替 线程 100

1、3个线程交替输出1-100

/**
 * 需求:
 * 3个线程交替输出1-100
 */
public class TestPrint1_100 {

    private Integer state = 1; // 状态值1-t1执行, 2-t2执行, 3-t3执行
    private Integer count = 1; // 循环次数初始值

    public void print1_100(TestPrint1_100 print1_100) {
        Thread t1 = new Thread(() -> {
            excute1_100(print1_100, 1, 2);
        });
        Thread t2 = new Thread(() -> {
            excute1_100(print1_100, 2, 3);
        });
        Thread t3 = new Thread(() -> {
            excute1_100(print1_100, 3, 1);
        });

        t2.start();
        t3.start();
        try {
            // 确保执行顺序
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.start();
    }

    /**
     *
     * @param print1_100 共享对象,用于对象锁
     * @param curState 当前现在状态
     * @param nextState 下一个线程状态
     */
    public void excute1_100(TestPrint1_100 print1_100, int curState, int nextState) {
        while (count <= 100) { // 循环条件
            synchronized (print1_100) { // 同一个对象锁
                if (state == curState) { // 状态值为当前线程的状态值才执行
                    System.out.println(Thread.currentThread().getName() + " - " + count);
                    state = nextState; // 下个线程的状态值赋值给状态值
                    count++; // 循环条件自增
                    print1_100.notifyAll(); // 唤醒所有的线程准备抢锁
                }else {
                    try {
                        print1_100.wait(); // 线程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        TestPrint1_100 print1_100 = new TestPrint1_100();
        print1_100.print1_100(print1_100);
    }
}

2、3个线程交替输出ABC

/**
 * 需求:
 * 3个线程交替输出ABC 3次
 */
public class TestPrintA_C {
    private Integer state = 1; // 状态值1-t1执行, 2-t2执行, 3-t3执行
    private Integer count = 1; // 循环次数初始值

    public void printA_C(TestPrintA_C printA_C) {
        Thread t1 = new Thread(() -> {
            excuteA_C(printA_C, "A", 1, 2);
        });
        Thread t2 = new Thread(() -> {
            excuteA_C(printA_C, "B", 2, 3);
        });
        Thread t3 = new Thread(() -> {
            excuteA_C(printA_C, "C", 3, 1);
        });

        t2.start();
        t3.start();
        try {
            // 确保执行顺序
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.start();
    }

    /**
     *
     * @param printA_C 共享对象,用于对象锁
     * @param data   需要输出的值
     * @param curState 当前现在状态
     * @param nextState 下一个线程状态
     */
    public void excuteA_C(TestPrintA_C printA_C, String data, int curState, int nextState) {
        while (count <= 9) { // 循环条件 3 * N,N代表交替输出的次数
            synchronized (printA_C) { // 同一个对象锁
                if (state == curState) { // 状态值为当前线程的状态值才执行
                    System.out.println(Thread.currentThread().getName() + " - " + data);
                    state = nextState; // 下个线程的状态值赋值给状态值
                    count++; // 循环条件自增
                    printA_C.notifyAll(); // 唤醒所有的线程准备抢锁
                }else {
                    try {
                        printA_C.wait(); // 线程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        TestPrintA_C printA_C  = new TestPrintA_C();
        printA_C.printA_C(printA_C);
    }
}

标签:print1,输出,ABC,Thread,param,printA,交替,线程,100
From: https://www.cnblogs.com/xiaonuanxin/p/17565675.html

相关文章

  • Spring Boot怎么输出到控制台
    SpringBoot是一个开发框架,它提供了许多方便的功能,包括输出到控制台。在本文中,我将介绍如何在SpringBoot应用程序中输出到控制台,并提供代码示例。在SpringBoot中,可以使用标准的Java输出语句System.out.println()来输出到控制台。但是,SpringBoot还提供了更方便的方法来输出日志......
  • .net 6 winform启动器:调用CMD命令行执行dotnet命令启动.net core程序并将控制台输出日
    背景历史遗留问题,生产车间运行的一个.netcoresignalr程序使用命令行程序启动,经常由于生产人员误操作将光标停留在控制台上导致程序假死,丢失部分测试数据,车间随便找了一台win10系统部署的程序,源代码遗失,电脑也是阉割版,原开发者已经离职多年无人敢动,于是想了一个歪门邪道发方......
  • [ABC310D] Peaceful Teams 题解
    PeacefulTeams题目大意将\(n\)个人分成\(T\)组,要求每组不能包含敌对的人,问有多少种分法。思路分析注意到\(n,T\)均很小,考虑爆搜。注意到直接枚举会枚举到分组顺序的全排列,所以可以强行嵌定大小关系去重。voiddfs(ints){if(s==n+1){for(inti=1;i<=t;......
  • python字符串转换GBK输出
    Python字符串转换GBK输出在Python中,字符串是一种常见的数据类型。它是由一系列字符组成的,可以包含字母、数字、符号等内容。在处理字符串时,有时候需要进行编码转换,特别是当涉及到中文字符时,常常需要将字符串转换为GBK编码输出。本文将为您介绍如何使用Python将字符串转换为GBK编码......
  • spark如何控制输出到hdfs上的小文件
    项目方案:Spark控制输出到HDFS上的小文件背景介绍在使用Spark进行数据处理和分析时,输出的结果数据通常存储在Hadoop分布式文件系统(HDFS)上。然而,有时输出的结果会被分割成大量的小文件,这可能对后续的数据读取和处理造成性能问题。因此,我们需要一种方法来控制输出到HDFS......
  • ABC284
    [ABC284D]HappyNewYear2023暴力肯定不行,尝试简单讨论一下。如果\(q>\sqrtn\),那么\(p^2<\sqrtn\),\(p<\sqrt[4]{n}\),枚举p就行。如果\(p^2>\sqrtn\),那么\(p<\sqrtn\),因为\(q<\sqrtn\),所以\(\min(p,q)\le\sqrt[3]{n}\),也可......
  • 题解 [ABC276F] Double Chance
    很容易想到分类。我们可以把\(1\)到\(i-1\)的球分为两类,一类是权值小于\(val_i\),另一类是权值大于\(val_i\)。对于第一类,\(sum\)加上小于\(val_i\)的球的个数乘以\(val_i\)。对于第二类,\(sum\)加上所有大于\(val_i\)的球的权值。这显然可以用两个树状数组维护。......
  • 在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输
    提示:1、数据帧的长度不定,但是帧头帧尾是固定的2、数据帧的参数数量不定,请注意3、每次收到的数据可能不是完整的一帧,但是不能把不完整的数据帧丢弃,应该等待到下一完整帧接收到后才丢弃4、一次可能接受到不止一个数据帧,可能是多个,需要针对不同数据帧进行分割搜说关键词:数据帧粘......
  • abc310e <公式递推(dp?)>
    题目E-NANDrepeatedly思路总结公式递推,找到相邻两项间的关系;代码Code#include<iostream>#include<algorithm>#include<vector>#include<cstring>usingnamespacestd;usingLL=longlong;usingPII=pair<int,int>;constintN=1e......
  • abc310d <dfs暴搜-分组方案数 / bitmask表示集合+dp>
    题目D-PeacefulTeams参考:https://www.cnblogs.com/legendstane/p/freee-programming-contest-2023-atcoder-beginner-contest-abc-310-solution.htmlhttps://blog.csdn.net/Muelsyse_/article/details/131747083思路方法1dfs暴搜由于数据范围极小,所以直接暴力即可......