1. 程式人生 > 其它 >執行緒通訊之訊號燈法

執行緒通訊之訊號燈法

訊號燈法是通過一個標誌位來解決執行緒之間通訊的問題,這裡我們運用演員表演完成觀眾才可以觀看的邏輯

實現思路:

  1. 定義三個類 演員、觀眾、互動平臺
  2. 演員負責表演節目,觀眾負責觀看節目
  3. 互動平臺我們用TV這個類來代表,它決定演員何時表演,觀眾何時觀看

程式碼:

package thread;

public class Thread12 {
    public static void main(String[] args) {
        Tv tv = new Tv();//要完成觀看和表演前提是要有個平臺
        new Player(tv).start();//兩個執行緒同時訪問tv物件
        new Watcher(tv).start();
    }
}
class Player extends Thread{
    Tv tv;//建立Tv型別的變數名字叫做tv
    public Player(Tv tv){//Tv tv和構造方法實現的是同一個功能,就是把外部傳進來的引數tv賦給類裡的tv
        this.tv = tv;
    }
    @Override
    public void run() {//重寫run方法
        for (int i = 0; i < 20; i++) {
            if (i%2==0){
                this.tv.play("快樂大本營播放中");
            }else {
                this.tv.play("白內障,看不清。莎普愛思滴眼睛");
            }
        }
    }
}
class Watcher extends  Thread{
    Tv tv;
    public Watcher(Tv tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            tv.watch();
        }
    }
}
class Tv{
    String voice;//定義表演節目TV
    boolean flag = true;//設定標誌位,flag為真演員表演,flag為假觀眾觀看
    public synchronized void play(String voice){
        if (!flag){
            try {
                this.wait();//flag為假,演員等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("演員表演了"+voice);
        this.notifyAll();
        this.voice = voice;//這行程式碼用於在外部類裡面修改表演的節目
        this.flag = !this.flag;
    }
    public synchronized void watch(){
        if (flag){
            try {
                this.wait();//flag為真,觀眾等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("觀眾觀看了"+voice);
        this.notifyAll();
        this.flag = !this.flag;
    }
}