1. 程式人生 > >線程---同步(synchronized)

線程---同步(synchronized)

brush main 負責 new run args cep ack rac

實現線程同步的一種方式介紹:

思路:

    首先,需要被協調的類,先實現線程,並重寫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

線程---同步(synchronized)