博客
关于我
java线程(19)——信号灯法,电视播放,生产者与消费者的案例
阅读量:328 次
发布时间:2019-03-04

本文共 2022 字,大约阅读时间需要 6 分钟。

通过标识符来组织消费者与生产者之间的关系:演员观众示例

代码内容

public class TestPC2 {
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;
}
@Override
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;
}
@Override
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) {
e.printStackTrace();
}
}
System.out.println("演员表演了:" + voice);
// 通知观众观看
this.notifyAll();
this.voice = voice;
this.flag = !this.flag;
}
// 观看
public synchronized void watch() {
if (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("观看了:" + voice);
// 通知演员表演
this.notifyAll();
this.flag = !this.flag;
}
}

运行结果

通过上述代码可以观察到,生产者(Player)和消费者(Watcher)通过TV类的方法进行交替操作。生产者周期性地调用play方法,切换播放不同的节目内容,而消费者则通过watch方法进行观看。当play方法被调用时,会检查当前的flag状态。如果flag为false,表示当前处于等待状态,生产者会等待消费者的通知(通过notifyAll)唤醒。唤醒后,生产者执行表演并切换flag状态,通知所有等待的消费者进行观看。

消费者在watch方法中同样会检查flag状态。如果flag为true,表示当前可以开始观看,消费者会等待生产者的通知(通过notifyAll)唤醒。唤醒后,消费者执行观看操作并切换flag状态,通知所有等待的生产者继续表演。

这种设计类似于信号灯模型,通过标识符(flag)和等待/通知机制,实现了生产者与消费者之间的交替操作,确保了资源的公平共享和高效利用。

转载地址:http://useq.baihongyu.com/

你可能感兴趣的文章
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named cv2
查看>>
No module named tensorboard.main在安装tensorboardX的时候遇到的问题
查看>>
No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
查看>>
No new migrations found. Your system is up-to-date.
查看>>
No qualifying bean of type XXX found for dependency XXX.
查看>>
No resource identifier found for attribute 'srcCompat' in package的解决办法
查看>>
no session found for current thread
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>
NO.23 ZenTaoPHP目录结构
查看>>
no1
查看>>
NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
查看>>