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
  • 相关阅读:
    解决docker pull很慢的方法
    Linux 基础 Day1
    linux运维人员必须熟悉的运维工具汇总
    chrome 浏览器插件推荐
    只能运维主要职责
    Linux查看所有用户用命令
    ubuntu16.04 离线包安装docker
    2013-10
    ELK原理与介绍
    shell中各种括号的作用()、(())、[]、[[]]、{}
  • 原文地址:https://www.cnblogs.com/pecool/p/9536931.html
Copyright © 2011-2022 走看看