解題思路
-
實現一個類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();
}
}
