Lock锁的通信机制,三个线程交替输出ABC

多线程交替打印ABC 题目描述 建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。   背景:其实这道题是在很久之前有次面试的笔试题,当时脑子里想起来要保证线程的执行顺序可以让线程sleep啊,我记得我写了一个for循环10次打印三个线程平均每个睡10ms,其实这已经违背题目了,题目要求三... 阅读详情

1、首先这里用到了Lock锁;
2、三个线程交替输出不同的字母,就需要三个不同的方法(输出A的方法,输出B的方法,输出C的方法);
3、并且必不可少还要用到Condition类完成线程间的通信;
4、还有一个必要的条件就是三个方法必须在同一类中,这样三个方法才能进行通信;
5、最后我们还需要一个变量进行标识轮流到哪个线程了。
第一步:创建拥有这三个方法的类

class AlternateDemo{
	private int number = 1;//当前正在执行线程的标记,1表示输出A,2表示输出B,3标示输出D
	private Lock lock = new ReentrantLock();//创建锁
	private Condition c1 = lock.newCondition();//控制输出A的线程
	private Condition c2 = lock.newCondition();//控制输出B的线程
	private Condition c3 = lock.newCondition();//控制输出C的线程
	//写A的方法
	public void loopA() {
		lock.lock();//加锁
		try {
			if(number!=1) {//如果条件不为1,则await
				c1.await();
			}
			//打印
			System.out.print(Thread.currentThread().getName());
			number = 2;
			c2.signal();//唤醒线程2
		}catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			lock.unlock();//释放锁
		}
	}
	//写B的方法
	public void loopB() {
		lock.lock();//加锁
		try {
			if(number!=2) {//如果条件不为2,则await
				c2.await();
			}
			//打印
			System.out.print(Thread.currentThread().getName());
			number = 3;
			c3.signal();//唤醒线程3
		}catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			lock.unlock();//释放锁
		}
	}
	//写C的方法
	public void loopC() {
		lock.lock();//加锁
		try {
			if(number!=3) {//如果条件不为3,则await
				c3.await();
			}
			//打印
			System.out.print(Thread.currentThread().getName());
			number = 1;
			c1.signal();//唤醒线程1
		}catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			lock.unlock();//释放锁
		}
	}
}

第二步创建线程
核心类创建好,我们就可以创建线程,这里就用实现Runnable的匿名内部类创建三个线程

public static void main(String[] args) {
		AlternateDemo ad = new AlternateDemo();//为核心类创建对象
		new Thread(new Runnable(){//创建写A的线程,并开始
			@Override
			public void run() {
				for(int i=1;i<=10;i++) {//写10次
					ad.loopA();
				}
			}
		},"A").start();
		new Thread(new Runnable(){//创建写B的线程,并开始
			@Override
			public void run() {
				for(int i=1;i<=10;i++) {//写10次
					ad.loopB();
				}
			}
		},"B").start();
		new Thread(new Runnable(){//创建写C的线程,并开始
			@Override
			public void run() {
				for(int i=1;i<=10;i++) {//写10次
					ad.loopC();
				}
			}
		},"C").start();
	}

运行结果:
在这里插入图片描述
正如我们预期的那样。这个问题的关键就在于一把锁进行同步输出,三个通信对象在三个线程之间进行通信。

正版63棋牌源代码游戏+728游戏全套带前端源代码解析 这俩天抽时间仔细看了一下这套项目包含完整的前端、后端及后台管理系统。从上传的截图可以看出,前端基于资源目录,后端采用和,后台管理界面提供数据查询与管理功能。本篇文章将从前端结构、后端接口、数据库设计、常见 BUG 及优化方法等方面逐步拆解,并给出相应的代码示例和实践经验。 阅读详情

相关推荐

SSE消息推送避坑指南:从Chrome兼容性到Spring超时配置

本文深入探讨了在Java Spring Boot项目中实现SSE消息推送时,从浏览器兼容性到后端配置的完整避坑指南。针对Chrome并发连接限制、Safari自动断开、Nginx代理缓冲以及Spring SseEmitter内存泄漏与超时管理等生产环境常见问题,提供了具体的解决方案和最佳实践配置,帮助开发者构建稳定可靠的实时推送系统。

work3的博客 449

java八股文面试[多线程]——三个线程交替打印ABC

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

u200814342A的博客 2002

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

线程共享经典面试题之交替输出(三种解法)

题目: 三个线程交替输出 abc,即 要求输出 abcabcabcabcabc 该如何实现?(其中线程1 输出 a 5 次,线程2 输出b 5 次,线程3 输出 c 5 次)。 该题目可由下面三种解法: 一、wait & notify 版 二、await & signal 版 三、park & unpark 版 如果对线程共享不了解的小伙伴可以去看看这篇文章: 看完之后这道面试题就迎刃而解了 一、wait & notify 版 通过设置 等待...

S mile0804的博客 1406

NRF52832调试方法1——HardFault_Handler问题定位

一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值,

小梁的博客 3650

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析)

本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。

weixin_27219587的博客 476

交替执行AB线程让A线程+1,B线程-1

调用LockSupport方法实现 import java.util.concurrent.locks.LockSupport; /** * およそ神 * 交替执行AB线程 */ public class Test1 { // 定义为static static Thread t1 = null; static Thread t2 = null; public static void main(String[] args) { Share share

Fanzongshen的博客 471

CS1237卡尔曼滤波实战:如何用24位ADC实现电子秤级精度?

本文详细介绍了如何利用CS1237 24位ADC芯片结合卡尔曼滤波算法实现电子秤级精度测量。通过解析CS1237硬件特性、卡尔曼滤波原理及STM32驱动优化,提供了一套完整的解决方案,包括多通道支持、驱动代码实现和性能调优技巧,适用于工业测量和嵌入式开发领域。

linux的博客 1087

给你三个线程,如何让它们交替打印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万+

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1930

KUKA机器人修改机器人名称和IP地址的具体方法示例

KUKA机器人修改机器人名称和IP地址的具体方法示例

Robot_PLC_HMI_Automation 5259

多线程知识:三个线程如何交替打印ABC循环100次

到此,本文内容已经讲解完毕,以上的这五种方法都可以利用不同的工具和机制来实现多线程之间的同步和通信,从而保证按照顺序交替打印ABC。这些方法各有优缺点,具体的选择需要根据实际的场景和需求来决定。

m0_71777195的博客 3814

【花雕学编程】Arduino ESP32 SPP 之使用Servo库控制360度舵机正反转

使用 Servo 库控制 360 度舵机的正反转是 Arduino ESP32 SPP 应用中的一个重要案例,具有简易控制接口、灵活速度调节和高兼容性等特点,广泛应用于机器人、自动化装置和动态艺术等领域。在第三个案例中,使用map()函数将用户输入的速度参数(范围0-100)映射到舵机控制的角度(0-180),使得用户能够以更人性化的方式控制舵机速度。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 1469

三个线程顺序打印ABC?我有十二种做法,彻底掌握多线程同步通信机制

三个线程顺序打印ABC?一次搞懂十二种做法,彻底理解线程同步通信机制!

三分恶的博客 3262

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

三个线程顺序打印ABC?我有十二种做法!

@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .mar...

程序员小明1024 1827

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

三个线程按顺序打印ABC?十二种做法,深入多线程同步通信机制

这篇文章分享一道非常不错的题目:三个线程按序打印ABC。 很多读者朋友应该都觉得这道题目不难,这次给大家带来十二种做法,一定有你没有见过的新姿势。

Javatutouhouduan的博客 682

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

面试官:请用五种方法实现多线程交替打印问题

文章目录三个线程T1、T2、T3,如何让他们按顺序执行?synchronized+wait/notifyjoin()LockLock+ConditionSemaphore 三个线程T1、T2、T3,如何让他们按顺序执行? 这是一道面试中常考的并发编程的代码题,与它相似的问题有: 三个线程T1、T2、T3轮流打印ABC,打印n次,如ABCABCABCABC… 两个线程交替打印1-100的奇偶数 N个线程循环打印1-100 … 其实这类问题本质上都是线程通信问题,思路基本上都是一个线程执行完毕,阻塞该线程,

zydybaby的博客 1575

有三个数abc 要求按大小顺序把它们输出_手撕面试题:多个线程顺序执行问题

第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到的是机试,直接写出运行。同类型的题目有很多,比如三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串两个线程交替打印 0~100 的奇偶数通过 N 个线程顺序循环打印从 0 至 100多线程按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印...

weixin_39865952的博客 1004

交替打印ABC的多种方法

这是一道经典的笔试题,最近团队招聘,大家又把它翻出来了。这里稍微梳理下几种做法。 synchronized todo ReentrantLock package reentrantlock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockABC { private static Lock lock = new Re.

玄大冰 1907

c语言父子线程交替打印,多线程交替打印ABC

对于一些需要多线程保持顺序的场景,需要我们实现线程间的交互。常见多线程通信方式:Synchronized + wait() + notify()Lock + await() + signal()semaphore基于semaphore的变体结合经典例题进行分析:多线程打印10遍ABC,形如ABCABCABCABCSynchronized + wait() + notify()wait()与noti...

weixin_29074409的博客 508

java多线程顺序打印abc_JAVA 多线程开篇 -从按顺序打印ABC开始

序言很想把一个问题弄清楚,特别是以前一直模模糊糊的并发编程,今天在华为OJ上碰到一道题,“顺序打印ABC的两种方法开始写起”,就以这道题开篇,希望日后有时间把并发编程的基本问题弄清楚。问题启动三个线程,一个线程打印A,一个打印B,一个打印C,按顺序打印ABC....。如输入3,输出就是“ABCABCABC”程序线程的调度是由系统操作的,要想多个线程按照要求顺序打印,就必须做好线程间的同步。思路:四...

weixin_31500907的博客 1378

同步队列:优雅解决多线程交替打印问题的实践指南

原创内容,请勿转载!交替打印问题是多线程编程中的经典面试题,也是检验开发者并发编程能力的重要标尺。传统实现方案虽然多样,但往往过于依赖底层并发原语,实现复杂且容易出错。本文将介绍一种基于同步队列的优雅解决方案,帮助开发者用更简洁、安全的方式应对这类问题。基于和代码简洁:消除复杂的锁和状态管理代码易于理解:数据流清晰,符合直觉的业务逻辑维护性好:业务逻辑与并发控制分离性能优异:无锁设计和直接交接带来更好的性能表现扩展性强:易于组合和扩展为更复杂的并发模式。

2501_93078354的博客 863

多线程顺序打印ABC的两种实现方式:synchronized与Lock机制

在多线程编程中,线程间的通信和同步是核心问题之一。本文将通过一个经典案例:三个线程分别打印3次A、5次B、6次C,并且按照A→B→C→A的顺序循环执行,来详细介绍Java中两种线程同步机制的实现方式。

m0_74230209的博客 543

18.2 线程安全、线程同步(同步代码块、同步方法、Lock锁)、线程状态、线程通信、线程调度常用方法、atm机取钱实例、医生看病实例、多种方法实现老板卖包子顾客吃包子方法

目录 线程安全 什么是线程安全 列:模拟买票,三个线程同时对共享的票进行售卖 线程同步 同步代码块 列:使用同步代码块实现买票 同步方法 列:使用同步方法块实现买票 Lock锁 列:Lock锁实现售票 线程状态 列:实现老板卖包子,顾客吃包子 列:实现老板卖包子,2个顾客吃包子 线程安全 什么是线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的 线...

Birdlun的博客 498

Java并发——线程间的通信

优先使用LockCondition如果需要精确控制线程唤醒顺序、支持中断或超时,或者需要更灵活的锁机制,推荐使用和Condition。避免虚假唤醒无论使用还是,判断条件时必须使用while循环,而不是if。在finally中释放锁必须放在finally块中,确保锁在任何情况下都能被释放,避免死锁。使用多个Condition实现精确通信当需要多个线程协作时,为每个线程创建独立的Condition,结合状态标志,可以显著提高代码的可读性和效率。注意notify()vs使用。

2301_82251392的博客 429
上一篇: 数据库事务的四个特征
下一篇: HTTP1.0、HTTP1.1、HTTP2.0的区别
Frank_Liu_Meng
博客等级 码龄8年 15粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值