线程协作初步

问题引入

用三个线程分别打印三次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();
}
}
}
}
}

试着运行了一下, 完美解决

新问题

本以为完美解决了, 整个人沉浸在获得新知识的愉悦中, 情不自禁的多运行了几次

结果发现并不是每次都能完美运行, 偶尔会出现死锁...

随着学习的深入, 以后再来解决这个问题

如有大佬随手指点迷津, 愚不胜感激 😃

posted @   树是树非树  阅读(136)  评论(1编辑  收藏  举报
编辑推荐:
· 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框架的用法!
点击右上角即可分享
微信分享提示