用java模拟交通灯系统实现
来源:互联网 发布:mac联网后无法上网 编辑:程序博客网 时间:2024/05/23 19:05
交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
Ø 异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
Ø 信号灯忽略黄灯,只考虑红灯和绿灯。
Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析:
这个题目中涉及到了三个对象交通灯Lamp、道路Lamp、汽车Car,基于面向对象的设计思想,可以想到Lamp类中具有交通的状态信息,交通灯的状态,交通灯变红、变绿的方法,通过自己的设计经验,自然可以想到我们的这个类最好的方法是使用枚举来实现;而Road类中,在路上跑的是汽车,所以Road类中具有一个承装汽车的集合,还具有产生汽车的方法和汽车通过路口以后移除汽车的方法。汽车类在我们的这个模拟系统中,是不需要设计的,我们使用一个String的字符串来代替汽车,从而简化我们的操作。
此外还需要一个控制交通灯变化的一个控制类,以及一个MainClass。
通过Executors类的静态方法来产生线程和定时器控制,比jdk1.5以前的Thread类更为高效一些。
项目源码如下:
Lamp类
package com.wj.interview.traffic;
/**
*
* @author wJing
* 交通灯,自然想到使用枚举来实现
*/
public enum Lamp {
/**
* S,N,W,E表示南,北,西,东
* S2N表示从南往北直行,S2W表示从南往西左转,以此类推
*/
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("","",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() {
//
// }
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();
}
// System.out.println("下一盏灯的名字:" + nextLamp.name());
return nextLamp;
}
}
LampController类
package com.wj.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* @author wJing
* 交通灯的控制器
*/
public class LampController {
private Lamp currentLamp;
public LampController() {
currentLamp = Lamp.S2N;
currentLamp.light();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
currentLamp = currentLamp.blackOut();
}},
10,
10,
TimeUnit.SECONDS);
}
}
Road类
package com.wj.interview.traffic;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
//定义一个汽车的集合
private List<String> vechicles = new ArrayList<String>();
private String name = null;
public Road(String name) {
this.name = name;
//jdk1.5的线程Executors,要比以前的优化一些
//必须把创建车的方法放到一个线程中,不然构造方法会阻塞
//随机产生车
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.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();
}
//或者将构造方法改为:Road(final String name)
vechicles.add(Road.this.name + "_" + i);
}
}});
//如果车通过了路口,则把车从集合中移除
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
@Override
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);
}
}
MainClass类
package com.wj.interview.traffic;
public class MainClass {
public static void main(String[] args) {
//十二盏灯的名字
String[] direction = new String[] {
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
//十字路口,十二盏灯,也就是十二条路
for(int i = 0; i < direction.length; i++) {
new Road(direction[i]);
}
//启动控制器
new LampController();
}
}
- 用java模拟交通灯系统实现
- 模拟交通灯管理系统
- 模拟交通灯管理系统
- 模拟交通灯管理系统
- 交通灯模拟系统
- 模拟交通灯管理系统
- java 面试题(一) [模拟交通灯管理系统]
- 交通灯系统模拟 之改进
- 多线程模拟交通灯管理系统
- java--交通灯管理系统
- java 交通灯管理系统
- java 交通灯管理系统
- Java-交通灯管理系统
- java、交通灯管理系统
- java--交通灯管理系统
- (JAVA)交通灯管理系统
- java--交通灯管理系统
- java--交通灯管理系统
- Ubuntu GCC简介和安装编译环境
- 黑马程序员 交通灯管理系统
- POJ 1067 取石子游戏
- CSS选择器
- hdu 2041 超级台阶
- 用java模拟交通灯系统实现
- HBase导出CSV格式数据的方法
- 【LeetCode】Sort List
- 最短路径--Floyd算法
- 胖子伤不起
- 类成员变量和实例成员变量分别指什么有什么区别(举例说明)?
- [DesignPattern]Observer Pattern (Python)
- Win8 Java Jdk1.6 环境变量配置
- 黑马程序员 银行业务调度系统