zoukankan      html  css  js  c++  java
  • [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();
    	}
    }
    
  • 相关阅读:
    省市区三级联动
    VUE项目PC端实现自适应rem
    (课堂笔记)第十三章GLSB涉及负载均衡算法
    LTM理解及配置笔记记录
    实验演示---GSLB部分(DC1)
    F5实验模拟拓扑
    (课堂笔记)第十三章:DNS 全局站点
    AbstractList类_Iterator内部类
    Oracle 时间格式化异常:无效数字
    Maven库镜像
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/13675753.html
Copyright © 2011-2022 走看看