博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程通讯-生产者消费者模型(信号灯法)
阅读量:2048 次
发布时间:2019-04-28

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

java线程通讯-生产者消费者模型(信号灯法)

上面博客采用缓存区方式实现了生产者与消费者

这篇介绍下生产者消费者模型的信号灯法,根据不停场景使用不同方式。

信号灯法:利用标识控制线程等待和唤醒,类似于信号灯,红灯性绿灯停。

举例:

站在司机的角度:红灯停,人走。 绿灯走,人停。
对象分析: 车 、 人 、 信号灯
: 就是来车行走。
:就是来人行走。
信号灯: 绿灯时车走行走,变灯通知人行走。 红灯时人行走,变灯通知车行走

实现:

// 信号灯    static class Signallamp{
boolean flag = true; // 绿灯 // 绿灯: 车走,人停 public synchronized void CarGO(){
// 不是绿灯,则停止等到人走 if(!flag){
try {
wait(); } catch (InterruptedException e) {
e.printStackTrace(); } } // 否则车走了,变成红灯,通只人行走 System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:车子行驶中"); System.out.println("变灯了"); flag = !flag; notify(); } // 红灯: 车停了,人走 public synchronized void ManGO(){
// 绿灯,则车走(司机角度是绿灯,自己角度真实应该是红灯) if(flag){
try {
wait(); } catch (InterruptedException e) {
e.printStackTrace(); } } // 否则人走了,变成绿灯,通知车走 System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:人在走路"); System.out.println("变灯了"); flag = !flag; notify(); } }
// 车    static class Car implements  Runnable{
Signallamp signallamp; public Car(Signallamp signallamp){
this.signallamp = signallamp; } // 车在行走 public void run() {
for (int i = 0; i <20 ; i++) {
signallamp.CarGO(); } } }
// 人    static class Man implements  Runnable{
Signallamp signallamp; public Man(Signallamp signallamp){
this.signallamp = signallamp; } // 人在行走 public void run() {
for (int i = 0; i <20 ; i++) {
signallamp.ManGO(); } } }
public static void main(String[] args) {
Signallamp signallamp = new Signallamp(); new Thread(new Car(signallamp)).start(); new Thread(new Man(signallamp)).start(); }

结果:

在这里插入图片描述
完美结束!

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

你可能感兴趣的文章
C语言学习笔记(三)—— 数据和C
查看>>
Java编程思想(三)—— 操作符
查看>>
梦飞 —— 述:我只是一个普通农民家的孩子,但我有一个梦想
查看>>
图解HTTP(二)—— 简单的HTTP协议
查看>>
程序员的数学(四)—— 数学归纳法,如何征服无穷数列
查看>>
不是技术人员也能看懂云计算、大数据、人工智能
查看>>
图解HTTP(三)—— HTTP报文内的HTTP信息
查看>>
图解HTTP(四)—— 返回结果的HTTP状态码
查看>>
JavaWeb高级编程(五)—— 使用会话来维持HTTP状态
查看>>
Intellij IDEA使用(十五)—— 如何在IDEA中一个Tomcat启动多个项目和多个Tomcat启动多个项目
查看>>
图解HTTP(五)—— 与HTTP协作的Web服务器
查看>>
程序员的数学(五)—— 排列组合,解决计数问题的方法
查看>>
前后端分离实践(四)—— 使用vue-cli搭建前端展示层并用mock模拟测试数据
查看>>
前后端分离实践(六)—— 前端与后端在生产环境中的分离部署
查看>>
启航 —— 记 —— 第二次自考的反思:自考与自我改造的困境
查看>>
数据结构与算法(三)——线性表
查看>>
Java8学习笔记(一)—— 函数式编程的四个基本接口
查看>>
Java8学习笔记(二)—— Lambda表达式
查看>>
Java8学习笔记(三)—— Optional类的使用
查看>>
Java8学习笔记(四) —— Stream流式编程
查看>>