ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程协作-信号灯法

2022-05-27 16:34:46  阅读:164  来源: 互联网

标签:Player tv start 信号灯 TV 协作 线程 new public


//测试生产者消费者问题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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有