三个线程交替打印A,B,C

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC 阅读详情

代码实现: 

package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName: ThreadCommunication
 * @Description: 三个线程交替打印A,B,C
 * @Author: xuezhouyi
 * @Version: V1.0
 **/
public class ThreadCommunication {
    //线程标识
    private Integer no = 0;
    private Lock lock = new ReentrantLock();

    //三个线程通信
    Condition condition0 = lock.newCondition();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();

    /**
     * 打印A
     */
    public void printA() {
        lock.lock();
        try {
            //非0线程则等待
            if (no != 0) {
                condition0.await();
            }

            //打印A
            System.out.println(Thread.currentThread().getName() + ":A");

            //唤醒1线程
            no = 1;
            condition1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 打印B
     */
    public void printB() {
        lock.lock();
        try {
            //非1线程则等待
            if (no != 1) {
                condition1.await();
            }

            //打印B
            System.out.println(Thread.currentThread().getName() + ":B");

            //唤醒2线程
            no = 2;
            condition2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 打印C
     */
    public void printC() {
        lock.lock();
        try {
            //非2线程则等待
            if (no != 2) {
                condition2.await();
            }

            //打印C
            System.out.println(Thread.currentThread().getName() + ":C");

            //唤醒0线程
            no = 0;
            condition0.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * Test
     */
    private static class Test {
        public static void main(String[] args) {
            final ThreadCommunication tc = new ThreadCommunication();
            final ExecutorService pool = Executors.newFixedThreadPool(3);

            //启动三个线程测试
            pool.submit(() -> {
                for (int j = 0; j < 3; j++) {
                    tc.printA();
                }
            });
            pool.submit(() -> {
                for (int j = 0; j < 3; j++) {
                    tc.printB();
                }
            });
            pool.submit(() -> {
                for (int j = 0; j < 3; j++) {
                    tc.printC();
                }
            });

            pool.shutdown();
        }
    }
}

运行结果:

pool-1-thread-1:A
pool-1-thread-2:B
pool-1-thread-3:C
pool-1-thread-1:A
pool-1-thread-2:B
pool-1-thread-3:C
pool-1-thread-1:A
pool-1-thread-2:B
pool-1-thread-3:C

算法_创建三个线程交替循环打印“A”、"B"、“C” 创建三个线程交替循环打印“A”、”B”、“C” package com.xwl; /** * 三个线程交替打印abc * @author Administrator * *主要的思想就是,为了控制执行的顺序,必须要先持有prev锁,也就是前一个线程要释放自身对象锁,再去申请自身对象锁, *两者兼备时打印字母,之后首先调用self.notifyAll()释放自身对象锁,唤醒下一个等待线程... 阅读详情

相关推荐

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8285

面试热点详解 —— 三个线程轮流打印

面试热点,三个线程轮流打印

战斧的博客 1294

网格自适应_Comsol案例解析17:自适应网格的使用

本期导读自适应网格细化有许多优势,比如可以不用对网格进行全局加密,增加计算精度,又会降低求解自由度。本期仍然以气泡上升案例为例,在两相流模块中使用自适应网格。【打开案例模型】【修改网格】适当让气泡边界加密,注意,曲率因子越小,曲线上的网格越密【添加自适应网格】使用默认的参数即可,这里的误差指示器用的是水平集phi。可以根据具体求解模型选择适当的自变量作为误差指示器。【口诀】默认的一般是最...

weixin_28726871的博客 5681

线程理解:三个线程交替顺序打印ABC

一、题目描述 建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印 这里参照网上方案,特此整理如下: 1、使用synchronized, wait和notifyAll 2、使用Lock->ReentrantLock 和 state标志 3、使用Lock->ReentrantLock 和Condition(await 、signal、signalAll) 4、使用AtomicI

jike11231的博客 2451

深入解析时钟同步技术:相位同步、频率同步与同源时钟的实战应用

本文深入解析时钟同步技术的三种核心方式:相位同步、频率同步与同源时钟,详细阐述其技术原理、实现方案及实战应用。通过对比分析不同同步方式的特点与适用场景,为电子系统设计提供选型指南,帮助工程师优化时钟网络设计,提升系统稳定性和性能。

weixin_29240711的博客 449

告别色差!用Python+TCS34725颜色传感器实现精准色彩还原(附完整校准代码)

本文详细介绍了如何利用Python和TCS34725颜色传感器实现专业级色彩还原方案。通过双阶校准法(白光校准和黑电平校准)和进阶的光照自适应技术,解决传感器原始数据不准的问题,并提供完整的校准代码和实战案例,帮助开发者实现ΔE<3的高精度色彩识别。

weixin_30836759的博客 209

三个线程交替打印的几种实现方式

线程的交替打印,实际上涉及的内容是线程间的通信,下面,介绍三种线程间通信实现的交替打印方法和一种非线程间通信的实现方式。

雅俗共赏的博客 2217

pg lib的信息及产生pg lib的三种方法

pg lib相比basic lib会多几方面pg 信息。除了pg arc(pg pin)以外,liberty还提供电压值,以及pmk cell的power_down_function功能相关信息。1.电压值除了常见的primary pg还有secondary pg和衬底。2.pg arc后端需要去做redhawk功耗分析,需要pg liberty提供pg arc,如果没有pg arc就需要手动去写custom lib代替3.pmk cell的power_down_function。

m0_61544122的博客 595

三个线程轮流打印ABC

1、多线程if和where的区别: 就是用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新判断if条件,直接继续运行if代码块之后的代码,而如果使用while的话,也会从wait之后的代码运行,但是唤醒后会重新判断循环条件,如果不成立再执行while代码块之后的代码块,成立的话继续wait。 2、 一.概述wait()方法可以使线程进入等待状态,而notify()可以使等待的状态唤醒 wait,notify和notifyAll方法是Object类的成员函数,所以Java的任何一个.

Infor_learning的博客 7747

基于YOLOv8的MVTec AD缺陷检测系统设计与实现

速度快,精度高;支持 anchor-free 架构;支持实例分割和图像分类;模块化代码,易于部署与改进;完美兼容 ONNX、TensorRT 等推理框架;官方支持多平台训练和推理(CPU/GPU)。YOLOv8 是工业视觉检测落地非常理想的选择。MVTec AD(Anomaly Detection)数据集包括15类工业对象,每个对象包括多个子类缺陷(例如 “scratch”, “crack”, “hole”)及正常图像。类别缺陷子类bottlecablecapsule。

YOLO 931

如何离线环境下安装Dify插件 (可提供远程指导协助)

离线环境下安装Dify插件

litlit023的专栏 8100

给你三个线程,如何让它们交替打印1、2、3

问题提出 前几天写了一篇 Java多线程:写一下两个线程交替打印 0~100 的奇偶数 介绍了如果用 wait/notify 控制两个线程交替执行,最后留了一个扩展问题:有三个线程,要求让它们交替输出 1、2、3,打印内容如下: 线程1:1 线程2:2 线程3:3 线程1:1 线程2:2 线程3:3 …… 该如何实现? 分析 沿用两个线程的交替打印的思路,重点是当第一个线程获取到锁的时候第二个线...

dadiyang的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。

/** * 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。 * 这个问题用Object的wait(),notify()就可以很方便的解决。 * * 主要的思想就是,为了控制执行的顺序,必须要先持有prev锁,也就前一个线程要释放自身对象锁,再去申请自身对象锁, * 两者兼备时打印,之后首先调用self.notify()

码农小札 832

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

建立三个线程A、B、C, A线程打印10次字母A, B线程打印10次字母B, C线程打印10次字母C,但是要求三个线程同时运行, 并且实现交替打印,即按照ABCABCABC的顺序打印

两种方法解题目; 1. package com.dume.server.face; /** * 建立三个线程A、B、C, * A线程打印10次字母A, * B线程打印10次字母B, * C线程打印10次字母C,但是要求三个线程同时运行, * 并且实现交替打印,即按照ABCABCABC的顺序打印。 */ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public clas

杜盟恩的博客 802

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

三个线程按顺序交替打印 A B C

【代码】三个线程按顺序交替打印 A B C。

MichaelZ的博客 471

三个线程交替打印A、B、C的问题

public class ThreadTest_syn implements Runnable { private String name; private Object prev; private Object self; private ThreadTest_syn(String name, Object prev, Obj

LH9898的博客 974

三个线程交替打印 abcabcabc…,一个打印 a,一个打印 b,一个打印 c。

import threading lock_a = threading.Lock() lock_b = threading.Lock() lock_c = threading.Lock() def print_a(num): if num < 0: return lock_a.acquire() print('a') lock_b.release() print_a(num-1) def print_b(num): if.

a18729562128的博客 286

java: 三个线程交替打印A、B、C

Java

amadeus_liu2的博客 351

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C。要求线程同时运行,交替打印10次ABC,写出实现代码。

代码】建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C。要求线程同时运行,交替打印10次ABC,写出实现代码。

weixin_45032903的博客 436

多线程交替打印ABC的多种实现方法

原文链接:https://blog.youkuaiyun.com/xiaokang123456kao/article/details/77331878 一、题目描述 建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。 二、Synchronized同步法 1、基本思路 使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒

嗯哼的博客 2922

java多线程打印数字十次,三个线程交替打印十次ABC

三个线程交替打印十次ABC1 package com.example.demo.thread;23 /**4 * @author wangdongjiang5 */6 public class Work {7 private volatile static String flag = "A";8 private static int countA = 0;9 priva...

weixin_34801390的博客 308
上一篇: linux下root用户竟然也无权限删除
下一篇: SpringBoot整合RabbitMQ
Mr.ChowSit
博客等级 码龄11年 30粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值