----------------------android培训、java培训、期待与您交流! ----------------------
交通灯管理系统
首先简单思考下,该怎么创建对象。
先画一个图,有助于分析,一切不可空想。
总共有12条路线,假设每个路口都有一个红绿灯控制,那么有四条路线就可以假设为常绿状态。另外八个可以先看成两组 s2n s2w ,e2w e2s .那么同样分别对应一组。
下一步设想红绿灯系统,汽车,路线。
黄灯可以忽略不计。
汽车需要看到自己前面对应灯是不是绿灯,还要看到前面是否有车。所以这里要建立路的集合,并且添加增加减少车辆的方法。
在每条路线上如果是绿灯每秒钟要减少一辆车,并且每秒钟都会检查本路线是否绿灯,如果绿灯变红那么下路线就变绿。
开始编程:
关于路(road)的编写。每条路线上都有一个路线名字并且有个车辆集合。现实生活中车辆时随机来的,所以这里集合车辆也是随机增加的。另外需要一个定时器,检查是否绿灯,如果绿灯就减少集合车辆。
关于灯的编写:12个灯,有四个是默认的路灯,其他每个灯有变亮变黑方法。
另外就是 控制灯的编写,因为只有一套控制系统,所以通过前面的知识用单例比较合适,在单例上推荐饿汉式
开始 编码:
1. Road
import java.util.*;
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> carList=new ArrayList<String>();
// 定义路线构造函数,因路线很多所以初始值为null;
private String name =null;
public Road(/*final*/String name){
this.name=name;
//定义线程池 产生车辆
//创建线程池
ExecutorService pool=Executors.newSingleThreadExecutor();
//给线程池分配任务 定义Runnable 实现对象
pool.execute(new Runnable(){
public void run(){
//建车辆
for(int i=0;i<=1000;i++){
//控制车辆的节奏。在一到十秒间随机生成一辆车。
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//车不停在vechicles 上产生 某个方向(Name) 上产生的的几辆车
//这是一个内部类,内部类访问外部类局部变量需要加final
//vechicles.add(name+"----------"+i);
//如富哦不加final 访问外部类成员变量 是 外部类名字 .this.name 如下
carList.add(Road.this.name+"---------------");
}
}
});
//建立定时器。
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
//连环爆破
timer.scheduleAtFixedRate(
new Runnable(){
//把集合的第一辆车移走
public void run(){
//检查是否有车
if(carList.size()>0){
//假如灯是绿的
boolean lighted=
//Lamp.valueOf(Road.this.name).isLighted();
Lamp.valueOf(Road.this.name).isLighted();
if(lighted==true){
System.out.println(
carList.remove(0)
+"is Traning"
);
}
}
}
},
//过多少秒干这事
1,
//上件事干完后在过多少秒 接着干
1,
//说明上面数字度量单位
TimeUnit.SECONDS);
}
}
2. 灯 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 oppsite,String next,boolean lighted){
this.oppsite=oppsite;
this.next=next;
this.lighted=lighted;
}
//为了让上面定义的 路线不报错,向程序提供一个无参构造方法
private Lamp(){}
//定义绿灯
private boolean lighted;
// 定义对应的灯
private String oppsite;
//定义下一个灯
private String next;
//是否变绿
boolean isLighted(){
return lighted;
}
// 提供变绿的方法 ,同事对应灯也变绿
public void light(){
this.lighted=true;
/**
* 这里不能直接写oppisite.lighted();
* 会让程序陷入死循环、
*/
if(oppsite!=null){
//返回名字对应的枚举对象,再掉用light方法
Lamp.valueOf(oppsite).light();
}
//调试信息 某方向的灯是绿的
System.out.println(name()+"lamp is green 下面有六个方向能看到汽车穿过");
}
//让灯变黑
public Lamp blackOut(){
this.lighted=false;
//让对应灯也变黑
if(oppsite!=null){
Lamp.valueOf(oppsite).blackOut();
}
Lamp nextLamp=null;
//假如有下一个灯,就让他变黑
if(oppsite!=null){
nextLamp=Lamp.valueOf(oppsite);
System.out.println("绿灯从"+name()+"------切换为"+oppsite);
nextLamp.light();
}
return nextLamp;
}
}
3. 灯的控制器
import java.util.concurrent.*;
import com.isoftstone.interview.traffic.Lamp;
public class LampController {
//定义当前灯
private Lamp currLamp;
//构造函数 让某一个灯变为绿色
public LampController(){
currLamp =Lamp.S2N;
currLamp.light();
//创建定时器 控制灯
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
//使当前灯变黑
currLamp=currLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
4. 建主函数窗口
public class MainClass {
/**
* @param args
*/
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培训、期待与您交流! ----------------------