condition精准唤醒
public class ConditionDemo {
private int curThread = 1;
private Lock lock = new ReentrantLock();
private Condition cond1 = lock.newCondition();
private Condition cond2 = lock.newCondition();
private Condition cond3 = lock.newCondition();
public void printOnce() {
lock.lock();
try {
while (1 != curThread) {
cond1.await();
}
System.out.println(Thread.currentThread().getName() + ": AAA");
curThread = 2;
cond2.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printTriple() {
lock.lock();
try {
while (2 != curThread) {
cond2.await();
}
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + ": BBB");
}
curThread = 3;
cond3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printFifth() {
lock.lock();
try {
while (3 != curThread) {
cond3.await();
}
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ": CCC");
}
curThread = 1;
cond1.signal();
System.out.println("=======================");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ConditionDemo an = new ConditionDemo();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
an.printOnce();
}
}, "线程A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
an.printTriple();
}
}, "线程B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
an.printFifth();
}
}, "线程C").start();
}
}