java 交通灯管理系统

来源:互联网 发布:邢台seo外包 编辑:程序博客网 时间:2024/05/21 07:52


交通灯管理系统:


模拟实现十字路口的交通管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:由南向北-----直行车辆
  由西向南---右转
  ……
信号灯忽略黄灯,只考虑红灯和绿灯


左转弯的灯受信号灯控制,右转弯的车不受控制


具体逻辑实现与现实生活中的逻辑一样


每辆车通过路口的时间为一秒。


通过这个交通灯管理系统的练习,对面向对象的思想有了更深一步的认识与学习,在这个项目中,主要是
懂得面向对象的思想,加上对多线程知识的应用。同时还使用了Jdk1.5中对线程知识的新应用方法。通过这个
练习使自己对线程的应用更加清晰。


对这个交通灯管理系统,首先用面向对象的思想进行分析,构造出Lamp类和Road类,
Lamp类代码如下:


构造lamp类要搞明白12个方向的路是如何控制的。
public enum Lamp 
{
N2S("S2N","S2W",false),E2W("W2E","W2N",false),S2W("N2E","E2W",false),W2N("E2S","N2S",false),
S2N(null,null,false),W2E(null,null,false),N2E(null,null,false),E2S(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
private boolean lighted;
String opposite;
String next;
private Lamp(String opposite,String next,boolean lighted)
{
this.opposite=opposite;
this.next=next;
this.lighted=lighted;

}
public  boolean getLight()
{
return lighted;
}

public void light()
{
System.out.println(this.toString()+"点亮");
this.lighted=true;
if(opposite!=null)
Lamp.valueOf(opposite).light();
}

public Lamp lampblack()
{
this.lighted=false;
if(opposite!=null)
{
//Lamp.valueOf(opposite).lampblack();
Lamp.valueOf(opposite).lighted=false;
}
Lamp nextLamp=null;
//System.out.println(next);//由于此处有递归,S2N(null,null,false),W2E(null,null,false),N2E(null,null,false),E2S(null,null,false),
//等没有next值,所以返回值为空,但第二次执行时next值不为空,所以,直到next的值不为空才将下一个等点亮,避免next值为null的情况
if(next!=null)
{
nextLamp=Lamp.valueOf(next);
nextLamp.light();
}
return nextLamp;
}
}


接下来是:Road类


public class Road
{
List<String> vehicles=new ArrayList<String>();
Lamp lamp;
String name;
public Road(String name)
{

this.name=name;
ExecutorService es=Executors.newSingleThreadExecutor();
es.execute(new Runnable(){
public void run()
{


for(int i=0;i<1000;i++)
{
try
{
Thread.sleep((new Random().nextInt(5)+1)*1000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

vehicles.add(Road.this.name+i);


}

}
});





ScheduledExecutorService exe=Executors.newScheduledThreadPool(1);
exe.scheduleAtFixedRate(
new Runnable()
{
public void run()
{
boolean isLighted=Lamp.valueOf(Road.this.name).getLight();
if(isLighted)
{
if(vehicles.size()>0)
System.out.println(vehicles.remove(0)+"is Travelling");
}
}
},
0,
1,
TimeUnit.SECONDS);


}

}


最后通过LampController类来控制Lamp对象的变化。
LampController类的实现:


public class LampController
{
Lamp currentLamp;


public LampController() {
this.currentLamp = Lamp.N2S;
this.currentLamp.light();
ScheduledExecutorService exe = Executors.newScheduledThreadPool(1);
exe.scheduleAtFixedRate(
new Runnable()
{
public void run()
{
currentLamp = currentLamp.lampblack();


}


},
10,
10,
TimeUnit.SECONDS);


}


}


原创粉丝点击