线程通信之信号灯法
信号灯法是通过一个标志位来解决线程之间通信的问题,这里我们运用演员表演完成观众才可以观看的逻辑
实现思路:
- 定义三个类 演员、观众、交互平台
- 演员负责表演节目,观众负责观看节目
- 交互平台我们用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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!