//测试生产者消费者问题2 :信号灯法,标志位解决
public class Main {
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;
}
public void 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){//通过构造器,来获取到tv
this.tv=tv;
}
public void run(){
for(int i=0;i<20;i++){
try {
tv.wait();
} catch(InterruptedException e) {
System.out.println("wait");
} finally {
}
}
}
}
//产品--节目
class TV{
//演员表演时,观众等待 true
//观众观看,演员等待 false
String voice;//表演的节目
boolean flag=true;//默认为真
//表演
public synchronized void play(String voice){
if(!flag){//flag不等于真的时候等待
try {
this.wait();
} catch(InterruptedException e) {
System.out.println("wait");
} finally {
}
}
System.out.println("演员表演了:"+voice);
//通知观众观看
this.notifyAll();//通知唤醒观众
this.voice=voice;
this.flag=!this.flag;
}
//观看
public synchronized void watch(){
if (flag){//如果flag等于真,那观众就等待
try {
this.wait();
} catch(Exception e) {
System.out.println("wait");
} finally {
}
}
System.out.println("观看了:"+voice);
//通知演员表演
this.notifyAll();
this.flag=!this.flag;//取反,比如:当前flag是真的时候,就让他为假,假则为真
}
}