Condition实现精准通知和唤醒
大约 1 分钟JavaJUC并发编程
public class C {
public static void main(String[] args) {
// 资源类
Data3 data = new Data3();
/**
* 实现效果:A ==> B ==> C ==> A
*/
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printA();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printB();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data.printC();
}
},"C").start();
}
}
/**
* 资源类
*/
class Data3{
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
/** 1A 2B 3C **/
private int num = 1;
public void printA(){
// 加锁
lock.lock();
try {
// 业务代码:判断 ==> 执行 ==> 通知
while (num != 1){
// 等待
condition1.await();
}
System.out.println(Thread.currentThread().getName() + "==>printA");
// 唤醒指定的人:B
num = 2;
condition2.signal();
} catch (Exception e){
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
public void printB(){
// 加锁
lock.lock();
try {
// 业务代码:判断 ==> 执行 ==> 通知
while (num != 2){
condition2.await();
}
System.out.println(Thread.currentThread().getName() + "==>printB");
// 唤醒指定的人:C
num = 3;
condition3.signal();
} catch (Exception e){
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
public void printC(){
// 加锁
lock.lock();
try {
// 业务代码:判断 ==> 执行 ==> 通知
while (num != 3){
condition3.await();
}
System.out.println(Thread.currentThread().getName() + "==>printC");
// 唤醒指定的人:A
num = 1;
condition1.signal();
} catch (Exception e){
e.printStackTrace();
} finally {
// 解锁
lock.unlock();
}
}
}
执行结果:
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
A==>printA
B==>printB
C==>printC
Process finished with exit code