zoukankan      html  css  js  c++  java
  • 线程---同步(synchronized)

    实现线程同步的一种方式介绍:

    思路:

        首先,需要被协调的类,先实现线程,并重写run方法

        然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入。

        其次,由控制器对象具体负责调用。

    举例:循环输出A/B/C

    main:

    public class Test {
    	public static void main(String[] args) {
    		Controller controller = new Controller();
    		new A(controller).start();;
    		new B(controller).start();;
    		new C(controller).start();;
    	}
    }

    控制器:

    public class Controller {
    
    	private int f=0;
    	
    	public synchronized void printA(){
    		if(f==0){
    			System.out.println("A");
    			f=1;
    			notifyAll();
    		}
    		try {
    			wait();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public synchronized void printB(){
    		if(f==1){
    			System.out.println("B");
    			f=2;
    			notifyAll();
    		}
    		try {
    			wait();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public synchronized void printC(){
    		if(f==2){
    			System.out.println("C");
    			f=0;
    			notifyAll();
    		}
    		try {
    			wait();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    

    线程A:

    public class A extends Thread{
    
    	private Controller controller;
    	
    	A(Controller controller){
    		this.controller = controller;
    	}
    	
    	@Override
    	public synchronized void run() {
    		for (int i = 0; i < 10; i++) {
    			controller.printA();
    		}
    	}
    	
    }
    

      

    线程B:

    public class B extends Thread{
    
    	private Controller controller;
    	
    	B(Controller controller){
    		this.controller = controller;
    	}
    	
    	@Override
    	public synchronized void run() {
    		for (int i = 0; i < 10; i++) {
    			controller.printB();
    		}
    	}
    }
    

      

    线程C:

    public class C extends Thread{
    
    	private Controller controller;
    	
    	C(Controller controller){
    		this.controller = controller;
    	}
    	
    	@Override
    	public void run() {
    		for (int i = 0; i < 10; i++) {
    			controller.printC();
    		}
    	}
    }
    

     

    输出:

    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C
    A
    B
    C

    Best Regards
  • 相关阅读:
    Comet OJ
    LOJ#2719. 「NOI2018」冒泡排序 DP+组合+树状数组
    LuoguP6747 『MdOI R3』Teleport 二进制+贪心
    LuoguP6748 『MdOI R3』Fallen Lord 树形DP+set
    LuoguP5576 [CmdOI2019]口头禅 后缀树+线段树+暴力
    LOJ#3161. 「NOI2019」I 君的探险 整体二分+随机化+二进制分组
    LOJ#2085. 「NOI2016」循环之美 莫比乌斯反演+杜教筛
    LuoguP5327 [ZJOI2019]语言 线段树合并+树链求并
    【考试题
    ELK
  • 原文地址:https://www.cnblogs.com/pecool/p/9536931.html
Copyright © 2011-2022 走看看