1. 程式人生 > 其它 >6.21Java多執行緒併發協作訊號燈法

6.21Java多執行緒併發協作訊號燈法

6.21Java多執行緒併發協作訊號燈法

通過標識位在方法當中進行資料操作

package iostudy.threadcooperation;

/**
* 生產者消費者實現方式二:訊號燈法
* 藉助標識位
* @since JDk 1.8
* @date 2021/6/21
* @author Lucifer
*/
public class CoTestNo2 {
public static void main(String[] args) {

/*新建資源類物件*/
Tv tv = new Tv();

new Player(tv).start();

new Watcher(tv).start();
}
}

/**
* 生產者 演員
*/
class Player extends Thread{

/*資源類屬性*/
Tv tv;

/*建立構造器*/
public Player(Tv tv){
this.tv = tv;
}

/*重寫run方法*/
@Override
public void run(){

/*迴圈說話*/
for (int i=0; i<20; i++){
/*加一個奇偶性達到觀看不一樣的效果*/
if (i%2==0){
this.tv.play("JunkingBoy");
}else {
this.tv.play("Lucifer!!!");
}
}
}

}

/**
* 消費者 觀眾
*/
class Watcher extends Thread{

/*資源類物件*/
Tv tv;

/*構造器*/
public Watcher(Tv tv){
this.tv = tv;
}

/*重寫run方法*/
@Override
public void run(){

/*迴圈新增控制*/
for (int i=0; i<20; i++){
tv.watch();
}

}
}


/**
* 同一個資源 電視
*/
class Tv{

/*資源類*/
String voice;
//加入訊號燈控制
boolean flag = true;

//T表示演員表演 觀眾等待--->一個方法
public synchronized void play(String voice){

//演員等待
if (flag){
try {
this.wait();
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}

System.out.println("表演了:" + voice);
this.voice = voice;

/*喚醒執行緒*/
this.notifyAll();

/*切換開關*/
this.flag =! this.flag;

}

//F表示觀眾觀看 演員等待
public synchronized void watch(){

//觀眾等待
if (flag){
/*觀眾等待判斷*/
try {
this.wait();
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}

System.out.println("聽到了:" + voice);

/*切換標誌*/
this.notifyAll();

}
}

通過布林量控制開關--->通過訊號燈控制