其他分享
首页 > 其他分享> > 线程协作-信号灯法

线程协作-信号灯法

作者:互联网

//测试生产者消费者问题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是真的时候,就让他为假,假则为真
    }
    
    
    
}

 

标签:Player,tv,start,信号灯,TV,协作,线程,new,public
来源: https://www.cnblogs.com/huxingchen/p/16318105.html