简介

三个线程一个线程输出0, 一个线程输出奇数, 还有一个线程输出偶数, 下面的代码感觉逻辑挺乱的.

code
import java.util.Scanner;
import java.util.concurrent.Semaphore;
import java.util.function.IntConsumer;

public class Main {
public static void main(String[] args) {
final Scanner reader = new Scanner(System.in);
int n = reader.nextInt();

ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(n);
new Thread(() -> {
try {
zeroEvenOdd.printZero(System.out::print);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
zeroEvenOdd.printEven(System.out::print);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
zeroEvenOdd.printOdd(System.out::print);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}

class ZeroEvenOdd {
private int n;

volatile int t;
volatile boolean b;
volatile boolean c;
public ZeroEvenOdd(int n) {
this.n = n;
t = n;
b = false;
c = false;
}

// printNumber.accept(x) outputs "x", where x is an integer.
public void printZero(IntConsumer printNumber) throws InterruptedException {
while(n > 0) {
synchronized (this) {
if(b == false) {
if(t!=n && t!=(n+1)) // 为什么要这么写呢, 首先比如输入n=5那么, 输出奇数他会首先输出1个0, 所以屏蔽, 然后奇数线程会获得执行然后输出1,然后他又获得执行权输出0
System.out.print(0);
b = true;
}
}

}
}

public void printEven(IntConsumer printNumber) throws InterruptedException {
while(n > 0) {
synchronized (this){
if(b == true) {
if(n %2 ==0) {
System.out.print(t-n);
n--;
b = false;
}
}
}
}
}

public void printOdd(IntConsumer printNumber) throws InterruptedException {
while(n > 0) {
synchronized (this) {
if(b == true) {
if (n % 2 != 0) {
System.out.print(t - n); // 这里会输出第一个0
n--;
b = false;
}
}
}
}


}


}