线程通信之信号灯法

信号灯法是通过一个标志位来解决线程之间通信的问题,这里我们运用演员表演完成观众才可以观看的逻辑

实现思路:

  1. 定义三个类 演员、观众、交互平台
  2. 演员负责表演节目,观众负责观看节目
  3. 交互平台我们用TV这个类来代表,它决定演员何时表演,观众何时观看

代码:

package thread;

public class Thread12 {
    public static void main(String[] args) {
        Tv tv = new Tv();//要完成观看和表演前提是要有个平台
        new Player(tv).start();//两个线程同时访问tv对象
        new Watcher(tv).start();
    }
}
class Player extends Thread{
    Tv tv;//创建Tv类型的变量名字叫做tv
    public Player(Tv tv){//Tv tv和构造方法实现的是同一个功能,就是把外部传进来的参数tv赋给类里的tv
        this.tv = tv;
    }
    @Override
    public void run() {//重写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;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            tv.watch();
        }
    }
}
class Tv{
    String voice;//定义表演节目TV
    boolean flag = true;//设置标志位,flag为真演员表演,flag为假观众观看
    public synchronized void play(String voice){
        if (!flag){
            try {
                this.wait();//flag为假,演员等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("演员表演了"+voice);
        this.notifyAll();
        this.voice = voice;//这行代码用于在外部类里面修改表演的节目
        this.flag = !this.flag;
    }
    public synchronized void watch(){
        if (flag){
            try {
                this.wait();//flag为真,观众等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("观众观看了"+voice);
        this.notifyAll();
        this.flag = !this.flag;
    }
}


posted @   萧何i  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示