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

本文共 1950 字,大约阅读时间需要 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/

你可能感兴趣的文章
python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
查看>>
python和java哪个更值得学——来自知乎高赞回答
查看>>
python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
查看>>
python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
查看>>
Python命名中尾随下划线有什么好处?
查看>>
Python启动脚本
查看>>
Python听写汇总结果
查看>>
python吊打Excel?屁!那是你不会用!
查看>>
Python合并两张图片 | 先叠透明度再合并 (附Demo)
查看>>
python各进制的表述与转换
查看>>
python各种库安装
查看>>
python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
查看>>
python可维护性_使用这7大神器,让你的Python 代码更容易于维护
查看>>
Python只运行一次while循环
查看>>
python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
查看>>
Python变量命名方法-ChatGPT4o作答
查看>>
Python变量与运算符
查看>>
Python变量/运算符/函数/模块/string
查看>>
python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
查看>>
python系列【仅供参考】:python flask框架 debug功能
查看>>