Semaphore
import java.util.concurrent.Semaphore;
import java.util.function.IntConsumer;
class ZeroEvenOdd {
private int n;
Semaphore s0 = new Semaphore(1);
Semaphore sOdd = new Semaphore(0);
Semaphore sEven = 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 = 1; i <= n; i++) {
s0.acquire();
printNumber.accept(0);
if (i % 2 == 0) {
sEven.release();
} else {
sOdd.release();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
sEven.acquire();
printNumber.accept(i);
s0.release();
}
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) {
sOdd.acquire();
printNumber.accept(i);
s0.release();
}
}
}
}
Semaphore
import java.util.concurrent.Semaphore;
import java.util.function.IntConsumer;
class ZeroEvenOdd {
private int n;
Semaphore s0 = new Semaphore(1);
Semaphore sOdd = new Semaphore(0);
Semaphore sEven = 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 = 1; i <= n; i++) {
s0.acquire();
printNumber.accept(0);
if (i % 2 == 1) {
sOdd.release();
} else {
sEven.release();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
sEven.acquire();
printNumber.accept(i);
s0.release();
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
sOdd.acquire();
printNumber.accept(i);
s0.release();
}
}
}
yield
import java.util.function.IntConsumer;
class ZeroEvenOdd {
private int n;
private int v = 0;
private int t = 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 = 1; i <= n; i++) {
while (v != 0) {
Thread.yield();
}
printNumber.accept(0);
v = 1;
t++;
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
while (v == 0 || t % 2 == 1) {
Thread.yield();
}
printNumber.accept(i);
v = 0;
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
while (v == 0 || t % 2 == 0) {
Thread.yield();
}
printNumber.accept(i);
v = 0;
}
}
}
ReentrantLock
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.IntConsumer;
class ZeroEvenOdd {
private int n;
ReentrantLock lock = new ReentrantLock();
Condition c0 = lock.newCondition();
Condition cOdd = lock.newCondition();
Condition cEven = lock.newCondition();
int v = 0;
int t = 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 = 1; i <= n; i++) {
lock.lock();
try {
while (v != 0) {
c0.await();
}
printNumber.accept(0);
t++;
v = 1;
if (t % 2 == 1) {
cOdd.signalAll();
} else {
cEven.signalAll();
}
} finally {
lock.unlock();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
lock.lock();
try {
while (v == 0 || t % 2 == 1) {
cEven.await();
}
printNumber.accept(i);
v = 0;
c0.signalAll();
} finally {
lock.unlock();
}
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
lock.lock();
try {
while (v == 0 || t % 2 == 0) {
cOdd.await();
}
printNumber.accept(i);
v = 0;
c0.signalAll();
} finally {
lock.unlock();
}
}
}
}
synchronized
import java.util.function.IntConsumer;
class ZeroEvenOdd {
private int n;
Object obj = new Object();
int v = 0;
int t = 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 = 1; i <= n; i++) {
synchronized (obj) {
while (v != 0) {
obj.wait();
}
printNumber.accept(0);
v = 1;
t++;
obj.notifyAll();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
synchronized (obj) {
while (v == 0 || t % 2 == 1) {
obj.wait();
}
printNumber.accept(i);
v = 0;
obj.notifyAll();
}
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
synchronized (obj) {
while (v == 0 || t % 2 == 0) {
obj.wait();
}
printNumber.accept(i);
v = 0;
obj.notifyAll();
}
}
}
}