ASP.Net+Android+IOS开发.Net培训期待与您交流!
首先应该看明白人家给的题目要求,看到这个题目,首先得注意两点:
1:十字路口有十二条方向的车辆
"N2S","N2E","S2N","S2W","E2W","E2S","W2E","W2N","N2W","S2E","E2N","W2S"
2:右转车辆不受灯信号控制
仔细分析,从N往S和从S往N的一样,考虑一条就可以,同样从东西方向的车辆,又去除右转向的,共分析四条线路即可。S2N,S2W,E2W,E2S即可。
3:该怎样划分程序,对象是哪个?这里一个面向对象分析重要的经验就是:谁拥有数据,谁就拥有处理这些数据的方法。比如人开门,我点灯等等。在这里,应该分为红绿灯,红绿灯控制系统三个类,车当成字符串。
package com.softstone.interview.traffic;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.Random;
public class Road {
//把路当成一个装各种车字符串的集合
//面向接口编程,这样让面试官看见比较好
//包名起人家公司的网址比较好,哈哈
private List<String> vechicles = 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=0;i<1000;i++){
try{//线程休眠1到10秒
Thread.sleep((new Random().nextInt(10)+1)*1000);
}catch(InterruptedException e){
e.printStackTrace();
}
//路上加车
vechicles.add(Road.this.name+"_"+i);//访问外部类的成员变量,Road.this.name S2W1代表从南往西的第一辆车
}
}
});
//下面是定时器,每隔一段时间运行一次线程
// Executors.newScheduledThreadPool(1)new出一个含有一个线程的线程池
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){//以固定频率运行线程
public void run(){
if(vechicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicles.remove(0)+"is traversing");//返回第一辆车
}
}
}
},
1,//延迟一秒
1,//时间为一秒
TimeUnit.SECONDS);//计时单位为妙
}
}
package com.softstone.interview.traffic;
public enum Lamp {
N2S(null,null,false),N2E(null,null,false),S2N("N2S","S2W",false),S2W("N2E","E2W",false),
E2S("W2N","S2N",false),E2W("W2E","E2S",false),W2N(null,null,false),W2E(null,null,false),
N2W(null,null,true),S2E(null,null,true),E2N(null,null,true),W2S(null,null,true);
private String opposite;
private boolean lighted;
private String next;
//看是否变亮
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+"lamp is green 下面总共应该看到有6个方向的汽车穿过");
}
public Lamp blackOut(){
this.lighted = false;
if(opposite != null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp = null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从"+name()+"------>切换为"+next);
nextLamp.light();
}
return nextLamp;
}
//对面的灯的状态,灯将要转变的状态,是否亮
private Lamp(String opposite,String next,boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
private Lamp(){}
public boolean isLighted(){
return lighted;
}
}
package com.softstone.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp;
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
//定时器
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
//这有个调试的方法
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
package com.softstone.interview.traffic;
public class MainClass {
public static void main(String[] args) {
String[] dirs = new String[]{
"N2S","N2E","S2N","S2W","E2W","E2S","W2E","W2N","N2W","S2E","E2N","W2S"
};
for(String str:dirs){
//new出每个路
new Road(str);
}
//启动红绿灯执行系统
new LampController();
}
}
ASP.Net+Android+IOS开发.Net培训期待与您交流!