執行緒通訊之訊號燈法
阿新 • • 發佈:2022-04-12
訊號燈法是通過一個標誌位來解決執行緒之間通訊的問題,這裡我們運用演員表演完成觀眾才可以觀看的邏輯
實現思路:
- 定義三個類 演員、觀眾、互動平臺
- 演員負責表演節目,觀眾負責觀看節目
- 互動平臺我們用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; } }