题目理解:
就是一共有三个线程,三个方法,每个线程都只会执行一个方法,因为线程的切换不是我们能控制的,这是操作系统做的事,我们要做的是当切换到该输出的线程时就让他输出,如果没有轮到这个线程输出就让出CPU让其他线程执行。
01020304:假设,线程A执行的是输出0的方法,线程B执行的是输出奇数的方法,线程C执行的是输出偶数的方法。则一开始切换到线程B但要先输出0,所以这时线程B应该礼让出CPU,让操作系统再次选则线程,如果选择到了线程A,执行方法后(输出0),让出CPU,等随机到线程B时让他执行输出奇数1。具体的输出实现是由方法里的那个传参实现的,不需要我们关系,我们只需要调用printNumber.accept(要输出的数字)。不需要过多的纠结这里
下面是代码实现:
class ZeroEvenOdd {
private int n; //这个是要输出到哪个数值
private int i=1; //这个记录的是要输出的数值
private boolean b = true; //为true时要输出的是0,为false时要输出具体数字i
public ZeroEvenOdd(int n) {
this.n = n;
}
// printNumber.accept(x) outputs "x", where x is an integer.
public void zero(IntConsumer printNumber) throws InterruptedException {
while(true){
if(i==n+1){ //当n这个数字也已经输出时就退出循环
break;
}
if(b){
printNumber.accept(0); //输出0
b=false;
}else{
Thread.yield();
}
}
}
public void even(IntConsumer printNumber) throws InterruptedException {
while(true){
if(i==n+1){
break;
}
if(!b){ //如果为false就说明该输出0了,就让出CPU。
if(i%2==0){//判断是否是偶数,如果不是就让出CPU
printNumber.accept(i);//输出i
b=true;
i++;
}else{
Thread.yield();//让出CPU
}
}else{
Thread.yield();
}
}
}
public void odd(IntConsumer printNumber) throws InterruptedException {
while(true){
if(i==n+1){
break;
}
if(!b){
if(i%2==1){
printNumber.accept(i);
b=true;
i++;
}else{
Thread.yield();
}
}else{
Thread.yield();
}
}
}
}