java 多线程-信号灯法
发布时间:2020-12-15 08:02:46 所属栏目:Java 来源:网络整理
导读:借助标志位 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
借助标志位
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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |