解题思路
-
实现一个类OddEven
- 有一个打印奇数的方法,有一个打印偶数的方法。
- 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印。
- 方法中打印每个数前首先判断volatile变量的状态,不该自己打印就使用Thread.yield()让出CPU,该自己就打印并调换状态。
-
在主函数中,两个线程共享一个OddEven实例,并调用打印奇数的方法或打印偶数的方法。
-
本质是线程的协作。
代码
class OddEven {
int n;
boolean flag = true;// flag为true则打印奇数,否则打印偶数
public OddEven(int n) {
this.n = n;
}
public void printOdd() {
for (int i = 1; i <= n; i = i + 2) {
while (!flag) {// 注意此判断在for循环里面,因为每次输出都要判断是否是该本线程输出
Thread.yield();
}
System.out.println(i);
flag = false;
}
}
public void printEven() {
for (int i = 2; i <= n; i = i + 2) {
while (flag) {
Thread.yield();
}
System.out.println(i);
flag = true;
}
}
}
public class OddAndEven {
public static void main(String args[]) {
int n = 10;
OddEven eddEven = new OddEven(n);
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
eddEven.printEven();
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
eddEven.printOdd();
}
});
threadA.start();
threadB.start();
}
}