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

面试之7K交通灯调度系统

2014-01-06 20:59 218 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

这一个例子是面试的时候,公司给学员的面试题,下面通过代码详细展现其实现过程:

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> vechicies=new ArrayList<String>();

private String name;

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

//线程池中的一个对象,他的执行效率比较高
ExecutorService pool=Executors.newSingleThreadExecutor();

//执行线程
pool.execute(new Runnable(){
public void run() {
for (int i = 1; i < 1001; i++) {

try {
//休眠1到10秒
Thread.sleep((new Random().nextInt(10)+1)*1000);
//把过来的车辆添加到集合中
vechicies.add(Road.this.name+"-"+i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

//定时器
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
//开始定时器,车辆开始行驶
timer.scheduleAtFixedRate(
new Runnable(){
public void run() {
if(vechicies.size()>0){
//获取当前灯的状态,是亮还是灭
boolean islight=Lamp.valueOf(Road.this.name).isLighted();
if(islight){
//如果为灯亮,便是绿灯,车辆可以继续行驶,并把数据从集合中删除
System.out.println(vechicies.remove(0)+"is traversing");
}
}
}
}, 
1, 
1, 
TimeUnit.SECONDS);
}

}

2.用枚举表示的十二条路,以及关于灯的方法

public enum Lamp {
/*
* S2N:表示南到北
* S2W:南到西
* E2W:东到西
* E2S:东到南
* N2S:北到难
* N2E:北到东
* W2N:西到北
* W2E:西到东
* S2E:南到东
* E2N:东到北
* N2W:北到西
* W2S:西到南
*/
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
//用来表示红灯或者绿灯的切换
private boolean lighted;
//第一个灯
private String opposite;
//下一个灯
private String next;

//第一个参数表示当前的灯,next表示下一灯,第三个参数表示是否点亮
private Lamp(String opposite,String next,boolean lighted)
{
this.opposite=opposite;
this.lighted=lighted;
this.next=next;
}

//主要根据值的真假获取灯的亮与不亮
public boolean isLighted()
{
return lighted;
}

//绿灯状态,表示可以通行
public void light()
{
this.lighted=true;
if(opposite!=null)
{

Lamp lamp=Lamp.valueOf(opposite);
//把灯点亮
lamp.light();
}
System.out.println(name()+"lamp is green,下面总共有6个方向能看到汽车穿过");
}

//红灯状态
public Lamp balackOut()
{
//把值改为false,关闭灯
this.lighted=false;
if(opposite!=null)
{
//关闭灯
Lamp.valueOf(opposite).balackOut();
}

Lamp nextLamp=null;
//把下一个灯点亮
if(next!=null)
{
//获取下一个当前灯
nextLamp=Lamp.valueOf(next);
//点亮下一个灯
Lamp.valueOf(next).light();
System.out.println("绿灯从"+name()+"------------->切换为"+next);
}
//返回下一盏灯
return nextLamp;
}

}

3.灯的控制器类:

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/**

 * 控制灯的亮与不亮

 * @author TOSHIBA_PC

 *

 */

public class LampController {

//当前灯的名字
private Lamp currentlamp;

public LampController()
{
//得到当前灯的名字
this.currentlamp=Lamp.S2N;
//把当前的灯点亮
this.currentlamp.light();
//创建一个定时器
ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);
//开启定时器
timer.scheduleAtFixedRate(
new Runnable(){
public void run() {
//把当前灯点灭
currentlamp=currentlamp.ba
9cdb
lackOut();
}
},
10,
10,
TimeUnit.SECONDS);

}

}

4.带有主函数的类调用开始运行系统:

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
//S2N S2W E2W  E2S N2S N2E W2E W2N S2E E2N N2W W2S

//用一个数组,表示十二条路
String[] directions=new String[]{"S2N","S2W", "E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};

for (int i = 0; i < directions.length; i++) {
new Road(directions[i]);
}
new LampController();

}

}

----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: