[Java併發]實現兩個執行緒交替列印奇偶數(volatile+yield實現)
阿新 • • 發佈:2020-09-15
解題思路
-
實現一個類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(); } }