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
  • 相关阅读:
    【POJ】1067 取石子游戏(博弈论)
    【POJ】2348 Euclid's Game(扩欧)
    【POJ】1061 青蛙的约会 / 【BZOJ】1477(扩欧)
    【POJ】3090 Visible Lattice Points(欧拉函数)
    【BZOJ】2190 [SDOI2008]仪仗队(欧拉函数)
    【POJ】2115 C Looooops(扩欧)
    【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
    [BZOJ4822][Cqoi2017]老C的任务
    [BZOJ1001][BeiJing2006]狼抓兔子
    [BZOJ1188][HNOI2007]分裂游戏
  • 原文地址:https://www.cnblogs.com/pecool/p/9536931.html
Copyright © 2011-2022 走看看