黑马程序员_交通灯管理系统

本文介绍了一种交通灯管理系统的设计与实现,系统使用Java编程语言,通过模拟真实世界中的交通灯控制逻辑,实现对不同方向行驶车辆的调度管理。系统考虑了直行、左转和不受信号灯控制的右转车辆,并通过线程Sleep模拟车辆通过路口的时间。
---------- android培训java培训、java学习型技术博客,期待与您交流!----------

        交通灯管理系统,这个是当年软通动力的面试题,也不晓得如今的面试题是否差不多的难度设置,不管如何,跟着张孝祥老师的视频完成了一遍,在此做个回顾和总结。
        先来看下该交通灯管理系统的需求。
1.异步随机生成按照各个路线行驶的车辆。例如:

    由南向而来去往北向的车辆 ---- 直行车辆

    由西向而来去往南向的车辆 ---- 右转车辆
    由东向而来去往南向的车辆 ---- 左转车辆
    ... ...
2.信号灯忽略黄灯,只考虑红灯和绿灯。
3.应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5.每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

        现实情况中,国人能严守交通规则的都不多,好好研究过十字路口交通灯的估计更少,好在自己拿过驾照,总算是有所了解,因此,张老师预先设置好的交通灯规则对我来说还是蛮好理解的。这里也根据草图来说:

        一般情况下,十字路口右转是不需要遵循交通灯的变化的,因此我们先确定主要考虑直行和左转的交通灯与汽车的协同情况。从上图中不难看出,在这个系统中总共有十二条路线,除了四个右转的路线,其他八条路线都是两两对应,同时以初始方向为基点来考虑的话,可以将这八条路径分为主变化和伴随变化的四组。由于具体需求中说明了只需要考虑红灯和绿灯两种情况,因此可以设计为亮状态为绿灯,暗状态为红灯。四个右转路线可以一直通行,所以把它理解为一直都是绿灯的状态。
        我们确定了有十二个方向的路线,自然的就有确定不变的十二个对应的交通灯,我们以枚举形式来定义它们是很方便的,下满来看Lamp类部分的代码。
public enum Lamp {
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
	N2S(null,null,false),N2E(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);

	private Lamp(String opposite,String next,boolean lighted){
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	
	private Lamp(){}
	
	private boolean lighted;
	private String opposite;
	private String next;
	
	public boolean isLighted(){
		return lighted;
	}
	
	public void light(){
		this.lighted = true;
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name() + " lamp is green, 下面总共应该有6个方向能看到汽车通行!");
	}
	
	public Lamp blackOut(){
		this.lighted = false;
		if(opposite != null){
			Lamp.valueOf(opposite).blackOut();
		}
		
		Lamp nextLamp = null;
		if(next != null){
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从" + name() + "-------->切换为" + next);
			nextLamp.light();
		}
		return nextLamp;
	}
}

        每个Lamp对象的亮黑状态用lighted变量表示,S2N、S2W、E2W、E2S这四个方向的交通灯作为主变化交通灯,这四个主变化交通灯依次轮询变亮,N2S、N2E、W2E、W2N为对应的伴随变化灯。opposite变量用来表示伴随变化灯,而next变量则表示当前主变化灯亮过后下一个亮的主变化灯。light()和blackOut()方法控制灯的明暗变化。除了主变化交通灯,其他交通灯都是不带有opposite和next参数的,所以直接就赋值为null,否则会使明暗方法进入死循环。除四个右转交通灯一直为代表亮的true外,其他交通灯的初始状态都为代表暗的false。
        再来看Road类和LampController类部分的代码。
public class Road {
	private List<String> vehicles = new ArrayList<String>();
	
	private String name = null;
	public Road(String name){
		this.name = name;
		
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){
			public void run() {
				try {
					Thread.sleep((new Random().nextInt(10) + 1) * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				for(int i=1; i<1000; i++){
					vehicles.add(Road.this.name + "_" + i);
				}
			}
		});
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run() {
						if (vehicles.size()>0) {
							boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
							if (lighted) {
								System.out.println(vehicles.remove(0) + " is traversing !");
							}
						}
					}
				}, 
				1, 
				1, 
				TimeUnit.SECONDS);
	}
}

public class LampController {
	private Lamp currentLamp;
	
	public LampController(){
		currentLamp = Lamp.S2N;
		currentLamp.light();
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						currentLamp = currentLamp.blackOut();
					}
				}, 
				10, 
				10, 
				TimeUnit.SECONDS);
	}
}

        每个Road对象都有一个name成员变量代表方向,一个vehicles成员变量代表各个方向上的车辆集合。在Road对象的构造方法中用线程池启动一个线程每隔一个1~10秒钟的随机时间向vehicles集合中增加一辆车。同时启动一个定时器,每隔一秒检查该方向上的交通灯是否为绿灯,是则将集合中的第一辆车移除,并打印一下情况。
        整个交通灯管理系统中只能有一套交通灯控制系统,所以LampController类被设计成了单例。LampController构造方法中设定了一个起始为绿的交通灯,这当然是必须的。同样的,该构造方法中也定义了一个定时器每隔10秒轮询变化交通灯的状态。
        最后看下主函数,整个系统也就完整了。
public class MainClass {
	public static void main(String[] args) {
		String[] directions = new String[]{
			"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
		};
		for(int i=0; i<directions.length; i++){
			new Road(directions[i]);
		}
		
		new LampController();
	}

}

----------  android培训java培训、java学习型技术博客,期待与您交流!----------
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安区域划分与基本安策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声参数或引入更多传感器类型进行扩展实验。
源码来自:https://pan.quark.cn/s/28c3abaeb160 在高性能计算(High Performance Computing,简称HPC)范畴内,处理器的性能衡量对于改进系统构建及增强运算效能具有关键价值。 本研究聚焦于一种基于ARM架构的处理器展开性能评估,并就其性能与Intel Xeon等主流商业处理器进行对比研究,特别是在浮点运算能力、存储器带宽及延迟等维度。 研究选取了高性能计算中的典型任务,诸如Stencils计算方法等,分析了在ARM处理器上的移植编译过程,并借助特定的执行策略提升运算表现。 此外,文章还探讨了ARM处理器在“绿色计算”范畴的应用前景,以及面向下一代ARM服务器级SoC(System on Chip,简称SoC)的性能未来探索方向。 ARM处理器是一种基于精简指令集计算机(Reduced Instruction Set Computer,简称RISC)架构的微处理器,由英国ARM Holdings公司研发。 ARM处理器在移动设备、嵌入式系统及服务器级计算领域获得广泛应用,其设计优势体现为高能效比、低成本且易于扩展。 当前的ARMv8架构支持64位指令集,在高性能计算领域得到普遍采用。 在性能测试环节,重点考察了处理器的浮点运算能力,因为浮点运算在科学计算、图形渲染和数据处理等高性能计算任务中扮演核心角色。 实验数据揭示,ARM处理器在双精度浮点运算方面的性能达到475 GFLOPS,相当于Intel Xeon E5-2680 v3处理器性能的66%。 尽管如此,其内存访问带宽高达105 GB/s,超越Intel Xeon处理器。 这一发现表明,在数据密集型应用场景下,ARM处理器能够展现出与主流处理器相匹敌的性能水平。 在实践...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值