JUC生产者消费者指定唤醒
JUC生产者消费者指定唤醒
使用不同的condition,调用signal()
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo {
public static void main(String[] args) {
Data data = new Data();
// 线程A
new Thread(() -> { for (int i = 0; i < 10; ++i) data.printA();}).start();
// 线程B
new Thread(() -> { for (int i = 0; i < 10; ++i) data.printB();}).start();
// 线程C
new Thread(() -> { for (int i = 0; i < 10; ++i) data.printC();}).start();
}
}
// 资源类
class Data {
// Lock对象
private Lock lock = new ReentrantLock();
// 监视器
private final Condition conditionA = lock.newCondition();
private final Condition conditionB = lock.newCondition();
private final Condition conditionC = lock.newCondition();
// 条件
private int num = 0;
// 当num==0时执行A
// 当num==1时执行B
// 当num==2时执行C
// 方法A
public void printA(){
// 上锁
lock.lock();
try {
// 等待
while (num != 0){
conditionA.await();
}
// 业务
System.out.println("A");
// 通知B
num = 1;
conditionB.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
// 方法B
public void printB(){
// 上锁
lock.lock();
try {
// 等待
while (num != 1){
conditionB.await();
}
// 业务
System.out.println("B");
// 通知C
num = 2;
conditionC.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
// 方法C
public void printC(){
// 上锁
lock.lock();
try {
// 等待
while (num != 2){
conditionC.await();
}
// 业务
System.out.println("C");
// 通知A
num = 0;
conditionA.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具