java基础--简单交通灯管理系统

来源:互联网 发布:武汉广电网络客服电话 编辑:程序博客网 时间:2024/06/06 07:39

一共存在四个类:Lamp,LampController,Road,Cilent。

Lamp类:设置灯的枚举类:该类中存在十二条路线的灯的枚举实例;

S2N,S2W,,E2W,E2S;

N2S,N2E,W2E,W2N;

S2E,E2N,N2W,W2S

将其分为三组,最后一组全为右转弯所以不用考虑灯的情况,右转弯一直未绿灯。

第二组为第一组的对立组,所以只用考虑第一组就行了,该枚举接收三个参数,分别为:green,opposite,next分别表示:灯的情况true为绿灯,false为红灯、对立路线、下一个路线。该枚举类有三个方法,分别是:isGreen得到当前灯的值, changeGreen将灯的值改变为true相当于改变为绿灯当改变为绿灯的时候如果对立的灯存在要将对立的灯的值也要改变为绿灯,chageRed将当前灯的值改变为false代表红灯。当改变为红灯的时候如果对立灯存在要将对立的灯改变为红灯,并且要将下一个灯改变为绿灯返回下一个灯。


LampController类:该类用于各个路线的灯由绿灯到红灯的切换,有一个Lamp类型的变量currentLamp 在构造方法中初始化为S2N并且将该灯设置为绿灯。该类的构造方法中存在一个周期性的线程。隔十秒将该灯变为绿灯,并且将下一个灯变为绿灯,再将先一个灯赋给currentLamp 每个十秒重复该过程,这样就实现了灯的循环。


Road类:该类中存在两个成员变量name和vehicles分别表示路线名和模拟车辆的队列的一个集合。该类的构造方法中存在两个线程,分别用于增加车辆,和放行车辆。第一个线程用于每隔1~10秒增加一辆车,将该车存入vehicles集合中。第二个是一个周期性的线程,如果当前路线灯为绿灯,就每个一秒放行一辆车。


Cilent类:主函数类,先创建一个路线名的数组,在循环中根据数组下标生成十二条路线对象,这样十二条路线的增加车线程,放行车线程就产生了。然后只需要启动交通灯控制器LampController类就形成了一个十二条路线的交通灯系统。



代码:

package>//定义十二条路线的枚举实例
//分为三组考虑
//第一组为四个方向分别是S2N,S2W,E2W,E2S他们的参数分别为:对应线路,下一个路线,当前路线的灯true为绿灯,false红灯。
S2N("N2S", "S2W",>this.next =>}

//返回当前灯的值,true为绿灯,false为红灯
public>if(opposite !=>if(opposite !=>{
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从 " +>//将该灯变为绿
currentLamp.changeGreen();
//产生一个线程池,该线程池中存放一个线程
ScheduledExecutorService>//周期性的启动该线程
//个十秒执行该线程,并且之后每个十秒就将灯变红。
//当变红的时候,currentLamp值为当前灯的下一个灯,并且灯的状态为绿灯
//这样就实现了循环执行。
timer.scheduleAtFixedRate(new Runnable()
{
public>}
}, 
10, 
10, 
TimeUnit.SECONDS);
}
}


③.


package>ExecutorService>pool.execute(new Runnable()
{
public void run()
{
for(int>{
try
{
//增加车辆间隔时间
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
//将该线路上的第几辆车加入到集合中。
vehicles.add(Road.this.name + "_" + i);
}
}
});

//创建一个周期性的线程池,该池中只有一个线程。
//每个一秒钟如果当前路线的灯为绿灯,就放行一辆车。
ScheduledExecutorService>timer.scheduleAtFixedRate(
new Runnable(){
public void run()
{
if(vehicles.size() > 0)
{
boolean>if(green)
{
System.out.println(vehicles.remove(0) + "  is traversing !");
}
}
}
},
1,
1, 
TimeUnit.SECONDS);
}
}


④.


package com.itheima.study.traffic;


public class Cilent
{
public static void main(String[] args)
{
//创建一个数组用于存放路线
String[]>"W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
//生成十二条路线,每条路线中有两个线程,一个用于增加车辆,一个用于如果当前路线为绿灯就周期性的放行车辆。
for(int>{
new Road(directions[i]);
}
//执行线路控制器,生成了控制器就会周期性的执行timer线程池中的线程
//就会实各个路线的灯由绿灯到红灯周期性的改变
//当改变为绿灯时候,各个为绿灯的路线中放行车辆的线程就会放行车辆
//这样就是实现了交通路线的多线程,就形成了一个交通灯系统
new LampController();
}
}