您的位置:首页 > 其它

模拟交通灯管理系统

2013-03-10 17:49 302 查看
简要分析下,一个简单的十字路口,暂不考虑黄灯,默认右转弯的绿灯一直处于亮着状态

可以建立

一个交通灯的对象:有十二个交通灯、负责灯亮的方法、负责灯变暗的方法

一个路的对象:创建车辆、绿灯时放行车辆

一个交通灯控制器:每隔10秒切换灯

一个负责系统运行的main

代码:

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个方向能看到汽车穿过!");

}

/**

* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿

* @return 下一个要变绿的灯

*/

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;

}

}

---------------------------------路--------------------------------

public class Road {

private List<String> vechicles = new ArrayList<String>();

private String name =null;

/***

* 将一条路作为一个单元处理,创建多辆车在路上,启动两个线程

* 线程一:创建模拟车

* 线程二:每隔一秒检查车辆能否放行

* @param name 路的名称,按照方向来辨别

*/

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);

System.out.println("新增车--");

}

}

});

//每隔一秒检查对应的灯是否为绿,是则放行一辆车

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);

}

}

-----------------------------交通灯控制--------------------------------

public class LampController {

private Lamp currentLamp;//定义当前灯

public LampController(){

//刚开始让由南向北的灯变绿;

currentLamp = Lamp.S2N;

currentLamp.light();

/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

System.out.println("每隔10秒切换下灯的状态......");

currentLamp = currentLamp.blackOut();

}

},

10,

10,

TimeUnit.SECONDS);

}

}

---------------------------负责系统运行的main-------------------------------------------

public class MainClass {

public static void main(String[] args) {

// 产生12个方向的路线

String [] directions = new String[]{

"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"

};

// 模拟12条路

for(int i=0;i<directions.length;i++){

new Road(directions[i]);

}

// 产生整个交通灯系统

new LampController();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: