解题思路
利用可重入锁reentrantlock搭配condition使用
打印1的线程必须首先执行,因此设置一个标记num,如果num为2才能执行打印2的线程,如果为3才能执行打印3的线程,如果不符合就调用await使线程进入等待,1执行完就调用signal唤醒2线程,2执行完就唤醒3线程
代码
class Foo {
ReentrantLock lock = new ReentrantLock();
int num = 1;
Condition num2 = lock.newCondition();
Condition num3 = lock.newCondition();
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
// printFirst.run() outputs "first". Do not change or remove this line.
lock.lock();
try{
printFirst.run();
num=2;
num2.signal();
}finally{
lock.unlock();
}
}
public void second(Runnable printSecond) throws InterruptedException {
// printSecond.run() outputs "second". Do not change or remove this line.
lock.lock();
try{
while(num!=2){
num2.await();
}
printSecond.run();
num=3;
num3.signal();
}finally{
lock.unlock();
}
}
public void third(Runnable printThird) throws InterruptedException {
// printThird.run() outputs "third". Do not change or remove this line.
lock.lock();
try{
while(num!=3){
num3.await();
}
printThird.run();
}finally{
lock.unlock();
}
}
}