---------------------- android开发、java培训、期待与您交流! ----------------------
项目需求
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
-----------------------------------------------------------------------
一.Road类
每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表
方向上的车辆集合。
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加
一辆车(用一个“路线名_id”形式的字符串进行表示)。
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,
是则打印车辆集合和将集合中的第一辆车移除掉。
public class Road { private List vechicles = new ArrayList(); private String name =null; public Road(String name) { this.name = name; //模拟车辆不断随机上路的过程 ExecutorService pool = Executors.newSingleThreadExecutor(); pool.execute(new Runnable() { public void run(){ for(int i=1;i<1000;i++) { try { Thread.sleep((new Random().nextInt(10) + 1) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } vechicles.add(Road.this.name + "_" + i); } } }); //每隔一秒检查对应的灯是否为绿,是则放行一辆车 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable() { public void run() { if(vechicles.size()>0) { boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); if(lighted) { System.out.println(vechicles.remove(0) + " is traversing !"); } } } }, 1, 1, TimeUnit.SECONDS); } }-----------------------------------------------------------------------
二.枚举Lamp类
系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合
这些因素,将Lamp类用java5中的枚举形式定义更为简单。
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象
依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个
nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因
为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方
向的灯用字符串形式表示。
增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,
这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和
oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的
nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。
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 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; } }用枚举类定义灯可以得到简化。
知识点1:Lamp枚举类中有个静态方法valueOf()
例如:Lamp.valueOf(opposite);
把名字传进去,就会返回这个名字对应的枚举对象,再去调用对应的方法;
-----------------------------------------------------------------------
三.灯的控制器LampController类
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯
变红和将下一个灯变绿。
部分代码:
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(){ System.out.println("来啊"); currentLamp = currentLamp.blackOut(); } }, 10, 10, TimeUnit.SECONDS); } }-----------------------------------------------------------------------
四.主函数
用for循环创建出代表12条路线的对象。
接着再获得LampController对象并调用其start方法。
部分代码:
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 { new Road(directions[i]); } new LampController(); } }
相关推荐
### 第三部分面试题 #### 47. collection和collections的区别 - `Collection`:接口,是Java集合框架的基础接口之一。 - `Collections`:工具类,提供了一系列静态方法用于操作集合。 #### 48. list,set,map是否...
### 黑马面试题总结 #### 一、进程与线程状态 **知识点:** - **进程与线程的区别:** - **进程**:是系统进行资源分配和调度的基本单位,每个进程都有独立的代码和数据空间(程序上下文)。 - **线程**:是...
资源名称:JAVA Android面试题讲解视频资源目录:【】2012黑马程序员01_面试题【】2012黑马程序员02_面试题【】2012黑马程序员03_面试题【】2012黑马程序员04_面试题【】225ce844c6c817e9614d8f17ea70a640【】...
"黑马面试题"这个主题很可能指的是来自知名IT教育机构“黑马程序员”所设计的一系列面试题目,这些题目旨在测试应聘者的编程基础、算法理解、系统设计能力以及对最新技术趋势的掌握。 首先,我们来探讨一些常见的...
"黑马java面试题总结"很可能是一个包含了这些主题的资源包,旨在帮助Java开发者准备面试,提升对技术的理解和应用能力。 首先,Java基础知识是面试中的常考项,包括但不限于语法特性(如封装、继承、多态)、面向...
十余年JAVA从业经验,精通JAVA技术体系,有志于做JAVA技能提升的朋友可与我联系,交个朋友 十余年JAVA从业经验,精通JAVA技术体系,有志于做JAVA技能提升的朋友可与我联系,交个朋友 十余年JAVA从业经验,精通JAVA...
"2018年黑马程序最新面试题汇总" 这个标题表明了这是一份针对2018年度编程面试的资源集合,由“黑马程序”提供,可能是一个教育机构或者在线学习平台。关键词“最新”暗示这份资料包含了当年最新的面试题目,对求职...
我们培训班刚发的面试题,2018年黑马最新程序员面试宝典+题库,内容包含大量java程序员初级知识点,以及框架的应用,js的基础。需要的赶紧下载准备面试吧. 2019年黑马最新版面试宝典题库 黑马 最新版面试 宝典题库
python面试题-黑马:web+爬虫+Linux+数据库
Vue面试题知识点总结 以下是根据提供的文件信息生成的知识点总结: 1. Vue 基础 * Vue 实例创建时,Vue 会遍历 data 中的属性,使用 Object.defineProperty(Vue 3.0 使用 proxy)将它们转换为 getter/setter,...
黑马程序员__移动商城项目实战 包括黑马程序员乐淘商城实战和慕课React+Antd
公式指标,黑马起爆,有助于判断什么时候可以入手
Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...
【标题】2018年12月份黑马学员面试题 这份资料集合了2018年12月份期间,黑马程序员学员在求职过程中遇到的真实面试题目,涵盖了多个IT技术领域,包括但不限于Java、Python、前端开发、数据库、操作系统、网络、数据...
这份资源是一份2023年Java面试题集,适用于准备Java开发岗位面试的人员。本资源收集了大量的Java面试题,旨在帮助读者熟悉Java编程语言以及相关的编程技术和知识点,从而在面试中更好地展现自己的能力和潜力。本资源...
黑马面试题附答案
以下是一些关于Android面试题的关键知识点,主要基于黑马程序员内部整理的资料: 1. **Activity**: - Activity是Android四大组件之一,它代表用户界面。通常,每个用户交互界面对应一个Activity。 - `...