[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();
	}
}

posted on 2020-09-15 21:27  coding_gaga  阅读(881)  评论(0编辑  收藏  举报

导航