题目
https://leetcode-cn.com/problems/print-zero-even-odd/
Semaphore
超时
class ZeroEvenOdd {
private int n;
//打印 零 奇数 零 偶数 零 奇数 零 偶数
Semaphore s1=new Semaphore(1);
Semaphore s2=new Semaphore(0);
Semaphore s3=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/2;i++){
s1.acquire();
printNumber.accept(0);
if(i%2==0){
s2.release();
}
else{
s3.release();
}
}
}
//奇数
public void odd(IntConsumer printNumber) throws InterruptedException {
for(int i=1;i<=n;i=i+2){
s2.acquire();
printNumber.accept(i);
s1.release();
}
}
//偶数
public void even(IntConsumer printNumber) throws InterruptedException {
for(int i=2;i<=n;i=i+2){
s3.acquire();
printNumber.accept(i);
s1.release();
}
}
}
synchronized
class ZeroEvenOdd {
private int n;
private int i = 1;
public ZeroEvenOdd(int n) {
this.n = n;
}
// printNumber.accept(x) outputs "x", where x is an integer.
public void zero(IntConsumer printNumber) throws InterruptedException {
synchronized(this){
while(true){
while(i <= 2*n&&i%2!=1){
wait();
}
if (i > 2*n) break;
printNumber.accept(0);
i++;
notifyAll();
}
}
}
//奇数
public void odd(IntConsumer printNumber) throws InterruptedException {
synchronized(this){
while(true){
while(i <= 2*n&&!((i%2==0)&&((i/2)%2==1))){
wait();
}
if(i > 2*n) break;
printNumber.accept(i/2);
i++;
notifyAll();
}
}
}
//偶数
public void even(IntConsumer printNumber) throws InterruptedException {
synchronized(this){
while(true){
while(i <= 2*n&&!((i%2==0)&&((i/2)%2==0))){
wait();
}
if(i > 2*n) break;
printNumber.accept(i/2);
i++;
notifyAll();
}
}
}
}