线程协作-信号灯法
//测试生产者消费者问题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是真的时候,就让他为假,假则为真 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义