private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
private int remark = 1;//
public static void main(String[] args) throws InterruptedException {
final ConditionTest test = new ConditionTest();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.printA();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.printB();
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.printC();
}
}
}, "C").start();
}
public void printA() {
lock.lock();
if (remark != 1) {
try {
c1.await();
} catch (InterruptedException e) {
}
}
remark = 2;
c2.signalAll();//依次唤醒下一个需要打印的线程
System.out.print(Thread.currentThread().getName());
lock.unlock();
}
public void printB() {
lock.lock();
if (remark != 2) {
try {
c2.await();
} catch (InterruptedException e) {
}
}
remark = 3;
c3.signalAll();
System.out.print(Thread.currentThread().getName());
lock.unlock();
}
public void printC() {
lock.lock();
if (remark != 3) {
try {
c3.await();
} catch (InterruptedException e) {
}
}
remark = 1;
c1.signalAll();
System.out.print(Thread.currentThread().getName() + "\t");
lock.unlock();
}