信号量
class ZeroEvenOdd {
private int n;
private final Semaphore sp0 = new Semaphore(1);
private final Semaphore sp1 = new Semaphore(0);
private final Semaphore sp2 = new Semaphore(0);
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++) {
sp0.acquire();
printNumber.accept(0);
if(i%2==0){
sp1.release();
}else{
sp2.release();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i+=2) {
sp2.acquire();
printNumber.accept(i);
sp0.release();
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i+=2) {
sp1.acquire();
printNumber.accept(i);
sp0.release();
}
}
}
volatile
class ZeroEvenOdd {
private int n;
volatile private int Next = 0;
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++) {
while(Next != 0) {
Thread.yield();
}
printNumber.accept(0);
if(i%2==0){
Next = 1;
}else{
Next = 2;
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i+=2) {
while(Next != 2) {
Thread.yield();
}
printNumber.accept(i);
Next = 0;
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i+=2) {
while(Next != 1) {
Thread.yield();
}
printNumber.accept(i);
Next = 0;
}
}
}