您的位置:首页 > 职场人生

黑马程序员——7K面试题交通灯(My)

2014-08-14 10:43 169 查看
  -------
android培训、java培训、期待与您交流! ----------

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

1、异步随机生成按照各个路线行驶的车辆。

例如:

由南向而来去往北向的车辆 ---- 直行车辆

由西向而来去往南向的车辆 ---- 右转车辆

由东向而来去往南向的车辆 ---- 左转车辆

。。。

2、信号灯忽略黄灯,只考虑红灯和绿灯。

3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

以上是需要做的题,但是呢!!我自己将题目该了一下。还请老师帮忙看一下代码以及运行效果。(不运行随时右转,必须按照红绿灯指示)

以下是我画了一张图:



从我的题中要求得知,红绿灯 只能允许 一面 行动,而且他行动的方位 只有3个方向。

我的思考方式:我有一个控制器,该控制器控制着 (东南西北) 4组 红绿灯。每一组红绿灯都对应着对面的路

当 南面 为 红灯时,只允许 北面车 行动,

当 东面 为 红灯时,只允许 西面车 行动,

当 北面 为 红灯时,只允许 南门车 行动,

当 西面 为 红灯时,只允许 东面车 行动。

东南西北都有随时随地来的车。(通过4个线程开启,每一个线程都对应着自己的那条路,随机时间产生随机车)
当 允许行动的那条路线可以行动时,则进行 1秒 remove 一辆车。

我的代码展示:

lamp类:每一个灯都有自己的固定时间,然后有一个返回下一个灯的时间(主要是来源于 张老师第一次将 enum 那个时候就想做红绿灯了)

public enum Lamp
{
RED(10){
public Lamp nextLamp()
{
return GREEN_3;
}
},
GREEN_3(30){
public Lamp nextLamp()
{
return RED;
}
},
GREEN_2(20)
{
public Lamp nextLamp()
{
return RED;
}

},
GREEN_1(10)
{
public Lamp nextLamp()
{
return RED;
}
};

protected  int time;

private Lamp(int time)
{
this.time = time;
}

public abstract Lamp nextLamp();
}


Roud类:只有路才知道 有 多少辆车,只有路才能将车移动。(面向对象设计)

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Roud
{
List<String> s = new ArrayList<String>();	//南
List<String> w = new ArrayList<String>();	//西
List<String> n = new ArrayList<String>();	//北
List<String> e = new ArrayList<String>();	//东

/**只要一被创建对象,我就开启4线程。
* */
Roud()
{
new Thread(new RoudAddCar(s, "s")).start();	//传入集合,和 路面
new Thread(new RoudAddCar(w, "w")).start();
new Thread(new RoudAddCar(n, "n")).start();
new Thread(new RoudAddCar(e, "e")).start();
}

//路要和删除的方法。
public void removeCar(List<String> list, String roudName)
{
if(list.size()>0)
{
list.remove(0);
System.out.println(roudName + " _ remove a car  , 待过的还有 : " + list.size());
}
}

}

class RoudAddCar implements Runnable	//添加车辆线程
{
private String roudName;
private List<String> list;

public void run()
{
for(int i=1; list.size()<500 ; i++)		//单条路线大于500就该请交警队了
{
try
{
Thread.sleep( (new Random().nextInt(10) + 1)*1000 );	//1~10,在乘以1000,在1~10秒内随机时间内产生车辆
list.add(roudName + "_" + i  );

System.out.println(roudName  + " add one");

}
catch (InterruptedException e)
{
e.printStackTrace();
}
}

}

RoudAddCar(List<String> list,String roudName)
{
this.list = list;

this.roudName = roudName;
}
}


Monitor类 : 控制器控制 灯,灯控制路,路控制车。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Monitor
{

Roud roud = new Roud();
public Lamp sLamp = Lamp.RED;		//南
public Lamp wLamp = Lamp.GREEN_3;	//西	对应	东
public Lamp nLamp = Lamp.GREEN_2;	//北	对应	南
public Lamp eLamp = Lamp.GREEN_1;	//东	对应	西

public void energization()		//控制器通电后开启4线程。
{
ExecutorService pools = Executors.newFixedThreadPool(1);
pools.execute(new Runnable(){
public void run()
{
while(true)
{
if(sLamp == Lamp.RED)		//南s	对应	北n,让 北面的车走。
{
System.out.println("RED等切换为:S 面,只 允许 N 面开车");
int time = sLamp.time;
while(time>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("S 面,Led---------->true: " + --time + "秒");
roud.removeCar(roud.n, "N");
}

}
sLamp = sLamp.nextLamp();<span style="white-space:pre">	//当 time<=0的时候。就切换灯
}
else
{
int overTime = sLamp.time;
while(overTime>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("S 面,Led---->false: " + --overTime + "秒");
}
}
sLamp = sLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//当 time<=0的时候。就切换灯</span>
}
}
}
});

ExecutorService poolw = Executors.newFixedThreadPool(1);
poolw.execute(new Runnable(){
public void run()
{
while(true)
{
if(wLamp == Lamp.RED)		//西w	对应	东e,让 东面的车走。
{
System.out.println("RED等切换为:W 面,只允许 E 面开车 ");
int time = wLamp.time;
while(time>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("W 面,Led---------->true: " + --time + "秒");
roud.removeCar(roud.e, "E");
}

}
<span style="font-family: Arial, Helvetica, sans-serif;">sLamp = sLamp.nextLamp();//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
else
{
int overTime = wLamp.time;
while(overTime>0)
{

threadSleep();
synchronized(Monitor.class)
{
System.out.println("W 面,Led---->false: " + --overTime + "秒");
}
}
wLamp = wLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
}

}
});

ExecutorService pooln = Executors.newFixedThreadPool(1);
pooln.execute(new Runnable(){
public void run()
{
while(true)
{
if(nLamp == Lamp.RED)		//北n	对应	南s,让 南面的车走。
{
System.out.println("RED等切换为:N 面,只允许 S 面 开车");
int time = nLamp.time;
while(time>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("N 面, Led---------->true: " + --time + "秒");
roud.removeCar(roud.s, "S");
}
}
nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
else
{
int overTime = nLamp.time;
while(overTime>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("N 面,Led---->false: " + --overTime + "秒");
}
}
nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
}

}
});

ExecutorService poole = Executors.newFixedThreadPool(1);
poole.execute(new Runnable(){
public void run()
{
while(true)
{
if(eLamp == Lamp.RED)		//东e	对应	西w,让 西面的车走。
{
System.out.println("RED等切换为:E 面,只允许 W 面 开车 ");
int time = eLamp.time;
while(time>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("E 面, Led---------->true: " + --time + "秒");
roud.removeCar(roud.w, "W");
}

}
eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
else
{
int overTime = eLamp.time;
while(overTime>0)
{
threadSleep();

synchronized(Monitor.class)
{
System.out.println("E 面,Led---->false: " + --overTime + "秒");
}
}
eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span>

}
}

}
});

}

public  void threadSleep()	// 车辆过的时候需要停留1秒钟
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}


MainClass类:创建控制器对象。调用 通电方法 。让程序跑起来。

public class MainClass {

public static void main(String[] args)
{
new
}

}


下次是程序部分运行的结果:

RED等切换为:S 面,只 允许 N 面开车
S 面,Led---------->true: 9秒
N 面,Led---->false: 19秒
W 面,Led---->false: 29秒
E 面,Led---->false: 9秒
S 面,Led---------->true: 8秒
W 面,Led---->false: 28秒
N 面,Led---->false: 18秒
E 面,Led---->false: 8秒
S 面,Led---------->true: 7秒
N 面,Led---->false: 17秒
W 面,Led---->false: 27秒
E 面,Led---->false: 7秒
s add one
n add one
S 面,Led---------->true: 6秒
N _ remove a car  , 待过的还有 : 0
N 面,Led---->false: 16秒
W 面,Led---->false: 26秒
E 面,Led---->false: 6秒
n add one
w add one
S 面,Led---------->true: 5秒
N _ remove a car  , 待过的还有 : 0
W 面,Led---->false: 25秒
N 面,Led---->false: 15秒
E 面,Led---->false: 5秒
e add one
S 面,Led---------->true: 4秒
N 面,Led---->false: 14秒
W 面,Led---->false: 24秒
E 面,Led---->false: 4秒
S 面,Led---------->true: 3秒
N 面,Led---->false: 13秒
W 面,Led---->false: 23秒
E 面,Led---->false: 3秒
S 面,Led---------->true: 2秒
N 面,Led---->false: 12秒
W 面,Led---->false: 22秒
E 面,Led---->false: 2秒
s add one
n add one
S 面,Led---------->true: 1秒
N _ remove a car  , 待过的还有 : 0
N 面,Led---->false: 11秒
W 面,Led---->false: 21秒
E 面,Led---->false: 1秒
S 面,Led---------->true: 0秒
N 面,Led---->false: 10秒
W 面,Led---->false: 20秒
E 面,Led---->false: 0秒
RED等切换为:E 面,只允许 W 面 开车
s add one
S 面,Led---->false: 29秒
N 面,Led---->false: 9秒
W 面,Led---->false: 19秒
E 面, Led---------->true: 9秒
W _ remove a car  , 待过的还有 : 0
S 面,Led---->false: 28秒
W 面,Led---->false: 18秒
N 面,Led---->false: 8秒
E 面, Led---------->true: 8秒
s add one
S 面,Led---->false: 27秒
N 面,Led---->false: 7秒
W 面,Led---->false: 17秒
E 面, Led---------->true: 7秒
S 面,Led---->false: 26秒
N 面,Led---->false: 6秒
W 面,Led---->false: 16秒
E 面, Led---------->true: 6秒
w add one
n add one
S 面,Led---->false: 25秒
N 面,Led---->false: 5秒
W 面,Led---->false: 15秒
E 面, Led---------->true: 5秒
W _ remove a car  , 待过的还有 : 0
e add one
S 面,Led---->false: 24秒
N 面,Led---->false: 4秒
W 面,Led---->false: 14秒
E 面, Led---------->true: 4秒
e add one
S 面,Led---->false: 23秒
N 面,Led---->false: 3秒
W 面,Led---->false: 13秒
E 面, Led---------->true: 3秒
n add one
S 面,Led---->false: 22秒
N 面,Led---->false: 2秒
W 面,Led---->false: 12秒
E 面, Led---------->true: 2秒
n add one
S 面,Led---->false: 21秒
W 面,Led---->false: 11秒
N 面,Led---->false: 1秒
E 面, Led---------->true: 1秒
s add one
S 面,Led---->false: 20秒
N 面,Led---->false: 0秒
RED等切换为:N 面,只允许 S 面 开车
W 面,Led---->false: 10秒
E 面, Led---------->true: 0秒
S 面,Led---->false: 19秒
W 面,Led---->false: 9秒
N 面, Led---------->true: 9秒
S _ remove a car  , 待过的还有 : 4
E 面,Led---->false: 29秒
S 面,Led---->false: 18秒
N 面, Led---------->true: 8秒
S _ remove a car  , 待过的还有 : 3
W 面,Led---->false: 8秒
E 面,Led---->false: 28秒
w add one
S 面,Led---->false: 17秒
W 面,Led---->false: 7秒
N 面, Led---------->true: 7秒
S _ remove a car  , 待过的还有 : 2
E 面,Led---->false: 27秒
S 面,Led---->false: 16秒
W 面,Led---->false: 6秒
N 面, Led---------->true: 6秒
S _ remove a car  , 待过的还有 : 1
E 面,Led---->false: 26秒
n add one
e add one
S 面,Led---->false: 15秒
W 面,Led---->false: 5秒
N 面, Led---------->true: 5秒
S _ remove a car  , 待过的还有 : 0
E 面,Led---->false: 25秒
S 面,Led---->false: 14秒
N 面, Led---------->true: 4秒
W 面,Led---->false: 4秒
E 面,Led---->false: 24秒
e add one
s add one
S 面,Led---->false: 13秒
N 面, Led---------->true: 3秒
S _ remove a car  , 待过的还有 : 0
W 面,Led---->false: 3秒
E 面,Led---->false: 23秒
S 面,Led---->false: 12秒
N 面, Led---------->true: 2秒
W 面,Led---->false: 2秒
E 面,Led---->false: 22秒
S 面,Led---->false: 11秒
N 面, Led---------->true: 1秒
W 面,Led---->false: 1秒
E 面,Led---->false: 21秒
w add one
S 面,Led---->false: 10秒
N 面, Led---------->true: 0秒
W 面,Led---->false: 0秒
RED等切换为:W 面,只允许 E 面开车
E 面,Led---->false: 20秒
S 面,Led---->false: 9秒
N 面,Led---->false: 29秒
W 面,Led---------->true: 9秒
E _ remove a car  , 待过的还有 : 4
E 面,Led---->false: 19秒


尊敬的老师:由于我没有根据张老师的那个要求做,还请抽点时间帮我一下。((*^__^*) 嘻嘻,虽然有点啰嗦,麻烦老师了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: