使用信号灯法实现生产消费者模式需要借助标志位。

下面以演员表演,观众观看电视为列,写一个demo

同一资源 电视:

//同一资源 电视
class Tv {
String voice;
// 信号灯
// T 表示演员表演 观众等待
// F 表示观众观看 演员等待
boolean flag = true; // 表演
public synchronized void play(String voice) {
if(!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("表演了:" + voice);
this.voice = voice;
// 唤醒
this.notifyAll();
// 切换标志
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;
} }

生产者 演员:

//生产者 演员
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();
}
} }

测试代码:

public class Cotest02 {
public static void main(String[] args) {
Tv tv = new Tv();
new Player(tv).start();
new Watcher(tv).start(); }
}

运行结果:

代码运行正常,使用信号灯法实现生产消费者模式成功。

最新文章

  1. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB
  2. 配置mongoDB服务
  3. eclipse 异常Unhandled event loop exception解决办法
  4. 关于QT安装的一些心得(QT551, VS2013)项目开发配置,以及项目结构分析
  5. nyoj 38 布线问题
  6. CCIE路由实验(6) -- 组播Multicasting
  7. maven的java web项目启动找不到Spring ContextLoaderListener的解决办法
  8. java zip解压
  9. .NET MVC 后台接受base64的上传图片
  10. PL-SLAM
  11. python脚本删除文件与目录的命令
  12. 使用doxygen静态分析开源代码
  13. mappingDirectoryLocations
  14. codeforces 691F 暴力
  15. Okra框架(三) 搭建HTTP服务器
  16. HDU 5696 区间的价值 暴力DFS
  17. 微信公众号--JS-SDK
  18. 理解CSS3属性transition
  19. 分层图【p4822】[BJWC2012]冻结
  20. java8--Mysql数据库与JDBC编程(java疯狂讲义3复习笔记)

热门文章

  1. 二、【Docker笔记】Docker的核心概念及安装
  2. iOS UITableView优化
  3. BZOJ 4472 salesman 题解
  4. [noip模拟]数字对&lt;RMQ&amp;二分&gt;
  5. RecyclerView的刷新分页
  6. java单元/集成测试中使用Testcontainers
  7. Python执行js之PyexecJs
  8. 7行代码搞定WEB服务
  9. SpringMVC(四):数据处理和过滤器
  10. 这些基本的 HTML5 标签你不能不知道