[Java並發]實現兩個線程交替打印奇偶數(volatile+yield實現)


解題思路

  • 實現一個類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();
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM