面试之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培训、期待与您交流! ----------------------
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培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_C#数组的学习
- 应不应该继续做程序员?
- 程序员--java面向对象特点总结
- loading黑马程序员之高级编程:枚举(4-1)
- 如何面试前端工程师:Github很重要
- 黑马程序员—学习有感
- 黑马程序员—7K 银行业务调度系统模拟
- IT求职整理Ⅲ---常见排序算法小结
- java集群技术面试的一些知识准备
- 主管喜欢什么样的程序员
- 程序员面试精粹02
- 程序员——了解用户的需求
- Geeks面试题:Min Cost Path
- 常见Java面试题 – 第二部分:equals与==
- 【黑马程序员】Java基础13:强大的正则
- 黑马程序员---线程
- 黑马程序员_银行业务调度系统
- 15个 MySQL 基础面试题,DBA 们准备好了吗?
- Java 面试题问与答:编译时与运行时
- 码农们:你属于哪一种极品程序员?