顺序打印
1、使用lock
class Foo {
private boolean isFinished1;
private boolean isFinished2;
private Object lock = new Object();
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
synchronized (lock){
printFirst.run();
isFinished1 = true;
lock.notifyAll();
}
}
public void second(Runnable printSecond) throws InterruptedException {
synchronized (lock){
while(!isFinished1){
lock.wait();
}
printSecond.run();
isFinished2 = true;
lock.notifyAll();
}
}
public void third(Runnable printThird) throws InterruptedException {
synchronized (lock){
while(!isFinished2){
lock.wait();
}
printThird.run();
}
}
}
2、使用CountDownLatch
class Foo {
CountDownLatch count1 = new CountDownLatch(1);
CountDownLatch count2 = new CountDownLatch(1);
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
count1.countDown();
}
public void second(Runnable printSecond) throws InterruptedException {
count1.await();
printSecond.run();
count2.countDown();
}
public void third(Runnable printThird) throws InterruptedException {
count2.await();
printThird.run();
}
}
3、使用信号量
class Foo {
Semaphore A;
Semaphore B;
Semaphore C;
public Foo() {
A = new Semaphore(1);
B = new Semaphore(0);
C = new Semaphore(0);
}
public void first(Runnable printFirst) throws InterruptedException {
A.acquire();
// printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
B.release();
}
public void second(Runnable printSecond) throws InterruptedException {
B.acquire();
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
C.release();
}
public void third(Runnable printThird) throws InterruptedException {
C.acquire();
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}