借助标志位

public class light {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){ this.tv=tv;}public void run(){ for(int i=0;i<20;i++) { this.tv.watch("无聊"); }}}//同一个资源 电视 class Tv {String voice;//信号灯//为真则演员表演,观众等待//为假则观众观看,演员等待boolean flag=true;//表演public synchronized void play(String voice){ if(!flag) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("表演了:"+voice); this.voice=voice; //表演后 this.notifyAll(); this.flag=!this.flag;}public void watch(String string) { // TODO Auto-generated method stub}//观看public synchronized void watch(){ if(flag) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("听到了:"+voice); //观看后: this.notifyAll(); this.flag=!this.flag;}}