线程协作初步
问题引入
用三个线程分别打印三次A, B, C, 要求保证其打印的顺序, 即打印出ABCABCABC
没错又是一道面试题, 后来学习了一些线程知识, 就突然想到这道题
解决方案
用ReentrantLock
绑定多个Condition
来实现线程协作
代码
public class ABC { static Lock lock = new ReentrantLock(); static Condition ca = lock.newCondition(); static Condition cb = lock.newCondition(); static Condition cc = lock.newCondition(); public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(a); executor.execute(b); executor.execute(c); lock.lock(); try { ca.signal(); } finally { lock.unlock(); } executor.shutdown(); } static class A implements Runnable { @Override public void run() { for (int i = 0; i < 3; i++) { lock.lock(); try { ca.await(); System.out.print("A"); cb.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } } static class B implements Runnable { @Override public void run() { for (int i = 0; i < 3; i++) { lock.lock(); try { cb.await(); System.out.print("B"); cc.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } } static class C implements Runnable { @Override public void run() { for (int i = 0; i < 3; i++) { lock.lock(); try { cc.await(); System.out.print("C"); ca.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } } }
试着运行了一下, 完美解决
新问题
本以为完美解决了, 整个人沉浸在获得新知识的愉悦中, 情不自禁的多运行了几次
结果发现并不是每次都能完美运行, 偶尔会出现死锁...
随着学习的深入, 以后再来解决这个问题
如有大佬随手指点迷津, 愚不胜感激 😃
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!