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

黑马程序员-交通灯管理系统

2013-03-18 11:50 441 查看
                                            ---------- android培训  java培训   期待与您交流!------------

 

学习了张孝祥老师的银行业务调度系统视频教程后,对于面向对象思想有了一个很直观的感受。

对于这道面试题,如果在还没看过这个教程之前,绝对能把我弄的糊里糊涂,但是张老师做这道题的思想确实很好。

 

题:模拟出十字路口红绿灯控制车辆的运行。

 

面对这道题首先应该认清楚总共有几条路线,每个方向都有开往其他路线的车,经过分析出来总共12条路线。



 

再总结出每一个方向都有向右行驶的路线,而向右行驶,并不会对其他路线造成影响,所以对于向右行驶的路线可以一直认为是绿灯,下面将不予考虑。

再思考:

比如 南向开往北向时,那么北向也是开往南向的,南向开往西向时,北向也会开往东向,两条路线是相对的,那样就可以将来去的两条路线看作是一对,只要控制好其中一条,另一条也会做出相同的动作。

 



根据上一步的理论,可以总结出:

 那么控制了南向的向北和向西的两条路线,然后使北向的灯也跟随南向的灯转换,那么等于说就完成了南北两向的路线了(向右车辆不考虑)

 既然南北可以这样做,东西向也就可以。张老师是控制了南向两个灯,和东向两个灯,其他灯跟随相对的灯转换,就完出了思路。

在接下来的教程中,张老师运用了面向对象的思路,问到:到了现在,你们想这个程序中应该有几个类?

   最后总结出 需要 :路 灯 控制器  

   车被当作了路的一部分,路管理车的运行。

以下是我看过教程后,自己做了一遍

1:首先创建路 :

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class road {
private List<String> car = new ArrayList<String>();

private String name;

public road(String name)
{
this.name = name;

//模拟车辆不断上路的过程

//一个执行者,可以创建一个线程池,由线程池来调用线程执行命令
ExecutorService pool = Executors.newSingleThreadExecutor();

//将一个任务交给线程池执行
pool.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i<1000; i++)
{
try {
//让线程停止1~10秒时间来不定时断续执行
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
car.add(road.this.name+"  "+i);
}

}
});

//模拟车辆不断下路的过程
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
if (car.size() > 0)
{
boolean b = lamp.valueOf(road.this.name).islu();
if(b)
System.out.println(car.remove(0)+"      开走了");
}
}
},
1,
1,
TimeUnit.SECONDS);

}
}

 

2.创建灯

/*
* 		s2n,s2w,e2s,e2w,
n2s,n2e,w2n,w2e,
s2e,e2n,n2w,w2s;
* */
public enum lamp {
s2n("n2s","s2w",false),s2w("n2e","e2s",false),e2s("w2n","e2w",false),e2w("w2e","s2n",false),
n2s(null,null,false),n2e(null,null,false),w2n(null,null,false),w2e(null,null,false),
s2e(null,null,true),e2n(null,null,true),n2w(null,null,true),w2s(null,null,true);

private boolean bl;
private String nextLamp;
private String opposite;

private lamp(String opposite,String nextLamp,boolean bl)
{
this.opposite = opposite;
this.nextLamp = nextLamp;
this.bl = bl;
}

public boolean islu()
{
return bl;
}

public void lu()
{
this.bl = true;
if(opposite != null)
lamp.valueOf(opposite).lu();
System.out.println(name()+"。。。变绿了。。。");
}

public String hong()
{
this.bl = false;
if (opposite != null)
lamp.valueOf(opposite).hong();
if(nextLamp != null)
{
lamp.valueOf(nextLamp).lu();
System.out.println("绿灯从"+name()+"切换为"+nextLamp);
}
return nextLamp;
}

}


3.创建灯的控制器

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class controller {
private lamp l = lamp.s2n;

public controller()
{
//刚开始让由南向北的灯变绿
l.lu();

//每隔10秒钟在四条路线中切换
ScheduledExecutorService se = Executors.newScheduledThreadPool(1);
se.scheduleAtFixedRate(
new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
l = lamp.valueOf(l.hong())	;
}
},
10,
10,
TimeUnit.SECONDS
);

}
}


4.最后调用

public class MainClass {
public static void main(String[] args)
{
String[] s = new String[]{"s2n","s2w","e2s","e2w",
"n2s","n2e","w2n","w2e",
"s2e","e2n","n2w","w2s"};

for (int i = 0;i<s.length;i++)
{
new road(s[i]);
}
new controller();
}
}


 

                                      
----------  android培训  java培训  
期待与您交流!------------

                                                              详情请点击:http://edu.csdn.net/

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