線程---同步(synchronized)
阿新 • • 發佈:2018-08-26
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)