package org.example.juclearning.learning02;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class RenDa {
public static void main(String[] args) throws InterruptedException {
TargetClass targetClass = new TargetClass(5);
Condition a = targetClass.newCondition();
Condition b = targetClass.newCondition();
Condition c = targetClass.newCondition();
new Thread() {
@Override
public void run() {
targetClass.print("a", a, b);
}
}.start();
new Thread() {
@Override
public void run() {
targetClass.print("b", b, c);
}
}.start();
new Thread() {
@Override
public void run() {
targetClass.print("c", c, a);
}
}.start();
Thread.sleep(1000);
try {
targetClass.lock();
a.signal();
} finally {
targetClass.unlock();
}
}
}
class TargetClass extends ReentrantLock {
int looperNumber;
public TargetClass(int looperNumber) {
this.looperNumber = looperNumber;
}
public void print(String content, Condition currentRoom, Condition nextRoom) {
for (int i = 0; i < looperNumber; i++) {
try {
lock();
currentRoom.await();
System.out.print(content);
nextRoom.signalAll();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
unlock();
}
}
}
}
代码的总体思路是,将三个不同的线程放到三个不同的房间内部。然后依次叫醒下一个线程。ReentrantLock的方便之处是可以精确唤醒,相比较于前几篇文章中的wait/notifyAll方法,不需要避免虚假唤醒的while循环。