这是一题笔试题,题目是实现一个交通灯管理系统,就是我们路口的红绿灯(不考虑黄灯),每辆车通过路口时间为1S,随机生成车辆和红绿灯交换时间间隔自定,可以设置,不需要做界面的实现。
看题目,我们先要理清思路再去写,首先想清楚交通灯是什么一个情况的:
有直行的,左拐的,右拐的。
1.所有车同时直行,肯定是要撞上了,只能东西方向直行,或者是南北方向直行。
2.所有路口的车辆同时左拐是可以的
3.所有车辆同时右拐也是可以的。
问题理清楚了,我们就开始试着去将它抽象出一个程序模型出来:
1:路可以作为一个对象,路上对应的灯可以作为是路的一个变量(最好是bool型的,有true or false两种情况),路上的车也是路德变量,红灯的时候增加,绿灯的时候减少。
2:这样的话我们只需要考虑四条线路,然后定义路上的车辆和红绿灯,让他们按照规律进行变化
3:这样我们就可以将问题抽象为 四个路线对象(东西,南北,所有路口左转的,所有路口右转的)
4:路对象的红绿灯呢在 true false之间跳转。
5:路对象的车变量在红灯的时候增多,绿灯的时候减少。
这样我们的模型就抽象出来了,我们只需要考虑四条路线随时间变化的情况。
模型抽象出来了,接下来我们再看一下实现这个模型需要用到哪些技术,和需要处理的技术细节。
1.四条路的状态时同时在变的(所以我们这里肯定是要用到多线程,没有二话的)
2.四条路线,在同一时间点只能有一个是绿灯,其他必须是红灯(否则撞车了)
a:要实现这个,我们把一个时间分为四份,每条路线占据的绿灯时间为四分之一,
b:这些路线的红绿灯按照一定的规律亮绿灯(绿红红红 红绿红红 红红绿红 红红红绿)这样的一个顺序一直变化下去(怎么实现呢,我们可以理想化一点,在我的程序里,我先定义一个路线,在绿灯时间过后定义第二个路线,这样一直到第四个路线)这样实现后,他们会按照指定的时间一直有规律的变化下去
3.当路口是红灯的时候,我们路上的车会越来越多,对车辆进行增加操作,当路口是绿灯的话,我们的车辆就进行减少,一直这样进行下去。
4.需要时间可以设置,那太简单了,我们只需要给它增加一个 settime()函数就OK拉。
下面是我实现的程序,没花时间在细节上,只是大概给它把功能实现了一下,肯定会有很多问题,也希望高手能贴出自己的解法,不吝赐教(当然这题目是源于张孝祥老师的一个视频,因为一些原因,我没有办法看那个视频,所以自己记下了题目,写了下,希望不会有板砖),也欢迎大家指正出里面的不足之处(毕竟我刚刚接触java),非常感谢了。
package Lamp;
/**
交通灯
*/
class road implements Runnable
{
int carnum = 0 ;
int time; //随机生成车辆的时间间隔
Lamp la; //监视灯的状态
road(int time,String name,Boolean state,int lamptime)
{
this.time = time;//初始化红绿灯时间
la = new Lamp(name,state,lamptime);
new Thread(la).start(); //启动灯监控线程
}
/*生成车辆时间间隔设置*/
void settime(int time)
{
this.time = time;
}
@Override
public void run()
{
while(true)
{
/*如果是绿灯,让车辆减少,否则,增加*/
if(la.state)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(carnum>0)
carnum--;
System.out.println("name: "+la.name+" state: "+la.state+" num: "+carnum);
}
else
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
carnum++;
System.out.println("name: "+la.name+" state: "+la.state+" num: "+carnum);
}
}
}
}
class Lamp implements Runnable
{
String name;
Boolean state = true;
int time;
Lamp(String name,Boolean state,int time)
{
this.name = name;
this.state = state;
this.time = time;
}
/*红绿灯时间间隔设置*/
void settime(int time)
{
this.time = time;
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
if(state)
{
try {
Thread.sleep(this.time*1000); //绿灯亮 time时间
}
catch (InterruptedException e)
{
e.printStackTrace();
}
state = false;
}
else
{
try
{
Thread.sleep(3*(this.time*1000));//红灯亮 3*time时间
}
catch (InterruptedException e)
{
e.printStackTrace();
}
state = true;
}
}
}
}
/*
* 根据红绿灯常识,我们可以知道,南北向路口红绿灯是一个颜色的,所有东西向路口红绿灯是一个颜色的
* 所有路口左转(右转)红绿灯是一个颜色的(所有路口车辆左转(右转),不会有相交的)
* 四种灯在同一个时间,只能有一个是绿灯,其他必须为红灯,一次循环。
*/
public class Lampcontrol
{
public static void main(String[] args) throws InterruptedException
{
/*让第一个路口启动*/
road r1 = new road(1,"r1",true,10);
new Thread(r1).start();
Thread.sleep(r1.la.time*1000);
/*让第二个路口启动*/
road r2 = new road(1,"r2",true,10);
new Thread(r2).start();
Thread.sleep(r1.la.time*1000);
/*让第三个路口启动*/
road r3 = new road(1,"r3",true,10);
new Thread(r3).start();
Thread.sleep(r1.la.time*1000);
/*让第四个路口启动*/
road r4 = new road(1,"r4",true,10);
new Thread(r4).start();
}
}
下面是我的运行结果,因为处理过于简单,我需要做一下说明:
(为了容易看清,我把红绿灯时间改成了 3S ,方便我们看清)
name: r2 state: false num: 31
name: r3 state: true num: 30
name: r1 state: false num: 34
name: r4 state: false num: 31
name: r2 state: false num: 32
name: r3 state: false num: 29
name: r1 state: false num: 35
name: r4 state: true num: 32
name: r2 state: false num: 33
name: r3 state: false num: 30
name: r4 state: true num: 31
name: r1 state: false num: 36
name: r2 state: false num: 34
name: r3 state: false num: 31
name: r4 state: true num: 30
name: r1 state: false num: 37
name: r2 state: false num: 35
name: r3 state: false num: 32
name: r4 state: false num: 29
name: r1 state: true num: 38
name: r2 state: false num: 36
name: r3 state: false num: 33
name: r4 state: false num: 30
name: r1 state: true num: 37
name: r2 state: false num: 37
name: r3 state: false num: 34
name: r4 state: false num: 31
name: r1 state: true num: 36
name: r2 state: true num: 38
name: r3 state: false num: 35
name: r4 state: false num: 32
name: r1 state: false num: 35
name: r2 state: true num: 37
name: r3 state: false num: 36
name: r4 state: false num: 33
name: r1 state: false num: 36
name: r2 state: true num: 36
name: r3 state: false num: 37
name: r4 state: false num: 34
name: r1 state: false num: 37
name: r1 state: false num: 38
name: r2 state: false num: 35
name: r3 state: true num: 38
name: r4 state: false num: 35
name: r1 state: false num: 39
name: r4 state: false num: 36
name: r2 state: false num: 36
name: r3 state: true num: 37
name: r1 state: false num: 40
name: r4 state: false num: 37
name: r2 state: false num: 37
我们可以在结果里看一下,四个路口始终保持只有一个为true,true的时候车辆是减少的(每秒一辆),false的时候是增加的(每秒一辆)。
当然我们也可以看到我的数据肯定是有问题的,因为这样很快马路就会堵死了,所以这应该相当于现实生活中的堵车了,哈哈,所以理论时间是产生车辆需要小于等于通行车辆的1/4就是最佳状态哦,呵呵