返回顶部
首页 > 资讯 > 后端开发 > Python >java多线程模拟交通灯管理系统
  • 132
分享到

java多线程模拟交通灯管理系统

2024-04-02 19:04:59 132人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了java多线程模拟交通灯管理系统的具体代码,供大家参考,具体内容如下 一、项目业务逻辑分析 项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下:

本文实例为大家分享了java多线程模拟交通灯管理系统的具体代码,供大家参考,具体内容如下

一、项目业务逻辑分析

项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下:

  • 异步随机生成按照各个路线行驶的车辆,例如由北向南行驶的车辆、由东向南行驶的车辆。
  • 信号灯忽略黄灯,只考虑红灯和绿灯的情况。
  • 左转受信号灯控制,右转车辆不受信号灯控制,其他情况与现实生活的逻辑相同。
  • 注:南北向车辆和东西向方向车辆交替放行,同方向等待车辆应先放行直行车辆,而后再放行左转车辆。
  • 每辆车通过路口所需时间为1秒(提示:可以通过线程的sleep方法模拟)。
  • 随机生成车辆,时间间隔以及红绿灯交换时间自定。
  • 不要求GUI,只考虑系统逻辑实现。可在在终端log方式模拟。

首先了解一下现实中十字路口的交通灯的业务逻辑(为此我大晚上在十字路口仔细观察了半个小时,缺少生活啊。),直接上图吧,直观明了:

额,乍一看有点乱,仔细一想很简单,就是东西南北四条路每条路都有三个去向,左转、右转和直行,这样一个十字路口就有了12个行驶方向。每个方向都有一个指示灯,也就是12个信号灯,如果每个信号灯都单独控制,那就麻烦多了,而且很不科学,得一天24小时堵车。需求第3点说明右转不受信号灯控制,其实现实生活照也是这样,一般右转车辆不受控制的(比较繁忙的路口受控制),随时可以转,也就是说永远是绿色等,想不通为什么这样设计?而 对立面的灯是同步变化的,同时绿或者同时红,这样只需要系统控制一个方向的灯就可以了。最后我们只需要控制四个方向的灯就行了,这里选择了图中标记的①②④③四条路线,只要在改变其中一条路线的信号灯时同步改变对立面的灯为相同信号就行了。另外还要同时把下一个信号灯切换成相反的信号,例如S2W变红时,同时N2E也要变红,并且E2W或W2E变绿。这里我们选择逆时针方向轮循。

二、系统详细设计

根据业务需求分析,需要对象:信号灯、信号灯控制系统、汽车和路线。下面具体分析每个对象所以属性和方法。
信号灯类(Lamp):信号灯只有红和绿两种状态,用boolean变量表示,true表示绿灯,false表示红灯。还要提供切换信号灯状态的方法turnRed和turnGreen。
信号灯控制系统(LampController):控制系统主要负责在规定时间切换红绿灯,并随着此类的创建,整个系统就开始运作,所以把系统启动的实现放在了构造方法内。
汽车(Vihicles):这里只需要体现汽车穿过路口的过程不需要体现移动细节,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。并且车是属于公路的,应该是一种聚合关系,根据拥有数据者应提供访问数据的方法的规律,这里路要提供增减车辆的方法。
路线(Road):每辆汽车不是看到对面的信号灯变绿就可以穿过的,要按照路线上的车队顺序依次通过路口,这个深有体会,堵车有时两次绿灯都过不去路口。

根据以上分析类图设计如下:

类图很简单,可以看出这三个类之间只是简单的关联, Road中要用到Lamp的信号灯状态判断是否放行车辆,LampController负责定时切换Lamp的信号灯状态。具体实现时为了方便有些方法的功能是放在构造方法里实现的。

三、具体实现

Lamp类:


public enum Lamp {
 
 //初始状态为红灯
 S2N("N2S","S2W",false),S2W("N2E","E2W",false),
 E2W("W2E","E2S",false),E2S("W2N","S2N",false),
 //对立面红灯
 N2E(null,null,false),N2S(null,null,false),
 W2E(null,null,false),W2N(null,null,false),
 //四个右转方向,始终时绿灯
 S2E(null,null,true),E2N(null,null,true),
 N2W(null,null,true),W2S(null,null,true);
 
 //灯的状态 true=green,false=red
 private boolean lighted;
 private String opposite=null;
 private String next=null;
 
 private Lamp() {}
 
 private Lamp(String opposite,String next,boolean initLighted){
  this.opposite=opposite;
  this.next=next;
  this.lighted=initLighted;
  
 }
 //判断灯的状态
 public boolean getLighted(){
  return lighted;
 }
 //绿灯亮  同时把对面的灯设为绿  下一个灯设为红灯
 public void turnGreen(){
  this.lighted=true;
 
  //如果对面有灯 
  if(opposite!=null){
   Lamp.valueOf(opposite).turnGreen();
  }
 }
 //红灯亮  对立面的灯也变红
 public Lamp turnRed(){
  this.lighted=false;
  Lamp nextGreenLamp=null;
  //对面的灯 同步变化
  if(opposite!=null){
   Lamp.valueOf(opposite).turnRed();
  }
  //下一个灯 绿灯亮 
  if(next!=null){
   nextGreenLamp=Lamp.valueOf(next);
   nextGreenLamp.turnRed();
  }
  return nextGreenLamp;
 }
}

Road类:


public class Road {
 //存放每条路上的车辆   车名就表示一辆车 
 private List<String> vehicles=new ArrayList<String>();
 private  String roadName=null;
 public Road(String roadName) {
  super();
  //根据路的方向取名,名字和对面的红绿灯同名 E2W表示东向西的路
  this.roadName = roadName;
  
  //用线程池启动一个线程,随机产生一辆车
  Executors.newSingleThreadExecutor().execute(new Runnable(){
   @Override
   public void run() {
    for(int i=1;i<1000;i++){
     try {
      //每隔1~10秒 随机产生一辆车
      Thread.sleep((new Random().nextInt(10)+1)*1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     //访问外部类的成员变量
     vehicles.add(Road.this.roadName+"路 第  "+i+" 辆车");
    }
   }
   
  });
  
  ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable(){
 
   @Override
   public void run() {
    //先判断这条路上是否有车
    if(vehicles.size()>0){
     //在判断交通灯状态   
     boolean lighted=Lamp.valueOf(Road.this.roadName).getLighted();
     if(lighted){
      //从汽车列表中移除  并提示已通过路口
      System.out.println(vehicles.remove(0)+"通过路口。。。");
     }
    }
   }
   
  }, 1, 1, TimeUnit.SECONDS);
 }
}

LampController类:


//灯控系统
public class LampController {
 private Lamp currentLamp;
 
 public  LampController() {
  super();
  //交通灯系统初始化   第一个运行的S2N turn green
  this.currentLamp = Lamp.S2N;
  this.currentLamp.turnGreen();
  //定时器 每个10s 切换一次信号灯状态
  ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable(){
 
   @Override
   public void run() {
     currentLamp=currentLamp.turnRed();
   }
   
  }, 10, 10, TimeUnit.SECONDS);
  
 }
}

运行结果:

四、总结

本题目整体结构很简单,不涉及复杂的设计模式,重点是对业务逻辑的分析,首先要搞明白交通信号灯的运行机制,如果不考虑右转的情况,简答理解就是东西方向和南北方向的车辆交替放行,同方向等待红灯的车辆先放行直行车辆一段时间,然后再放行左转的车辆。在具体实现上有两个难点:其一就是利用线程设置定时器,实时监控每条路上的信号灯状态和模拟随机在各个方向的路上产生一些车辆,控制系统的任务比较简单只需要定时轮流切换信号灯状态。其二是巧妙的把四个方向的信号灯设计成了一个环形链表,控制系统只需要控制一个信号灯,其他3个就有规律的联动运行了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: java多线程模拟交通灯管理系统

本文链接: https://lsjlt.com/news/132616.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java多线程模拟交通灯管理系统
    本文实例为大家分享了java多线程模拟交通灯管理系统的具体代码,供大家参考,具体内容如下 一、项目业务逻辑分析 项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下: ...
    99+
    2024-04-02
  • java多线程实现交通灯管理系统
    本文实例为大家分享了java多线程实现交通灯管理系统的具体代码,供大家参考,具体内容如下 一. 项目要求 模拟实现十字路口的交通灯管理系统逻辑。详细需求例如以下: 1、异步随机生...
    99+
    2024-04-02
  • C++实现路口交通灯模拟系统
    交通灯信号控制是交通工具现代化的产物,在平面交叉口,为了把可能发生冲突的车流从时空上分离,必须通过交通信号对交通流进行有效的引导和调度。 设计要求: (1)  设计一个十字...
    99+
    2024-04-02
  • Java多线程编程小实例模拟停车场系统
    下面分享的是一个Java多线程模拟停车场系统的小实例(Java的应用还是很广泛的,哈哈),具体代码如下:Park类public class Park {boolean []park=new boolean[3]; public bool...
    99+
    2023-05-30
    java 多线程 ava
  • java多线程之火车售票系统模拟实例
    1.前言为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票。2.非同步代码package com.tl.skyLine.thread; public class SellTic...
    99+
    2023-05-31
    java 多线程 模拟售票
  • Java多线程实现模拟12306火车站售票系统
    该系统一共涉及到3个类: 车票(Ticket) 12306系统(System12306) 售票窗口(Window) 车票类,涉及三个属性: 起始...
    99+
    2024-04-02
  • Java多线程模拟银行系统存钱问题详解
    目录一、题目描述二、解题思路三、代码详解多学一个知识点一、题目描述 题目:模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。 实现:使用特殊域变量volatile实现同步。...
    99+
    2024-04-02
  • Java利用多线程模拟银行系统存钱问题
    目录多线程6(模拟银行系统存钱)1.题目2.解题思路3.代码详解多线程6(模拟银行系统存钱) 1.题目 模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。 实现:使用syn...
    99+
    2024-04-02
  • Java多线程如何实现模拟12306火车站售票系统
    这篇文章主要介绍Java多线程如何实现模拟12306火车站售票系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!该系统一共涉及到3个类:车票(Ticket)12306系统(System12306)售票窗口(Windo...
    99+
    2023-06-15
  • Java多线程环境下死锁模拟
    目录1、死锁产生的条件 2、模拟多线程环境下死锁的产生3、死锁的排查 1、死锁产生的条件 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。...
    99+
    2024-04-02
  • java多线程编程之管道通信详解
    上一章节讲了wait/notify通信,这一节我们来探讨使用管道进行通信。 java中提供了IO流使我们很方便的对数据进行操作,pipeStream是一种特殊的流,用于不同线程间直接传送数据。一个线程将数据发送到输出管道,另一个线程从输入管...
    99+
    2023-05-30
    java 多线程 管道通信
  • python模拟实现图书管理系统
    本文实例为大家分享了python实现图书管理系统的具体代码,供大家参考,具体内容如下 软件python 事先用代码写一个存储数据的数据库,也就是,.txt文件这是我模拟的一个数据 d...
    99+
    2024-04-02
  • java多线程模拟实现售票功能
    铁道部发布了一个售票任务,要求销售1000张票,要求有3个窗口来进行销售,请编写多线程程序来模拟这个效果。 1 线程类 测试方法: public static void main...
    99+
    2024-04-02
  • Java通过卖票理解多线程
            以卖票的例子来介绍多线程和资源共享,下面我们来看看为什么要用卖票作为例子。  卖票是包含一系列动作的过程,有各种操作,例如查询票、收钱、数钱、出...
    99+
    2023-05-31
    java 多线程 卖票
  • 工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计
     工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理    工程项目各模块及其功能点清单 一、系统管理     1、数据字典:实...
    99+
    2023-10-07
    java 企业工程管理系统源码
  • Java多线程之简单模拟售票功能
    一、创建 二、完整代码 package com.ql; import lombok.SneakyThrows; import okhttp3.Call; import okh...
    99+
    2024-04-02
  • Java实战之多线程模拟站点售票
    目录一、实验题目二、分析三、完整代码:一、实验题目 二、分析 哦吼,这次的实验题目是一道非常经典的多线程买票问题。题目要求我们创建5个线程来模拟卖票,当然这其中就包含多线程存在也就...
    99+
    2024-04-02
  • Java多线程事务管理的实现
    目录实现多线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable和Future接口多线程单条数据事务管理今天要讨论的是“Java实现多线程单条数据事...
    99+
    2024-04-02
  • 通过Python脚本理解系统线程
    from socket import *  #导入socket包中的所有内容from time import ctime  #导入time包,同时在本地可使用ctime进行调用import thread #导入Python线程包BUFSI...
    99+
    2023-01-31
    线程 脚本 系统
  • Java实现简单通讯录管理系统
    本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下 题目: 1、完成一个通讯录,需求: (1)添加联系人(联系人:编号,姓名,手机号,QQ,邮箱地址)...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作