线程协作-信号灯法
作者:互联网
//测试生产者消费者问题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