Lock + Condition
class ZeroEvenOdd {
private int n;
Lock lock = new ReentrantLock();
// 上一个数字是否是 0
boolean hasZero = false;
// 上一个数字是否是 奇数
boolean hasOdd = false;
Condition signalZero = lock.newCondition();
Condition signalEven = lock.newCondition();
Condition signalOdd = lock.newCondition();
public ZeroEvenOdd(int n) {
this.n = n;
}
// printNumber.accept(x) outputs "x", where x is an integer.
public void zero(IntConsumer printNumber) throws InterruptedException {
for (int i = 0; i < n; i++) {
lock.lock();
try {
if (hasZero) {
signalZero.await();
}
printNumber.accept(0);
hasZero = true;
if (hasOdd) {
signalEven.signal();
} else {
signalOdd.signal();
}
} finally {
lock.unlock();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
lock.lock();
try {
if (!hasZero || !hasOdd) {
signalEven.await();
}
printNumber.accept(i);
hasOdd = false;
hasZero = false;
signalZero.signal();
} finally {
lock.unlock();
}
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
lock.lock();
try {
if (!hasZero || hasOdd) {
signalOdd.await();
}
printNumber.accept(i);
hasOdd = true;
hasZero = false;
signalZero.signal();
} finally {
lock.unlock();
}
}
}
}
信号量
似乎很多人喜欢使用信号量,以后再补吧。