----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
package com.isoftstone.interview.traffic;
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;
/*
(一)Road类
1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
2.在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。
3.在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。*/
public class Road {
//统计车
private List <String> vechicles = new ArrayList<String>();
private String name =null;
public Road(String name)
{
this.name = name;//路的名称
//创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行
ExecutorService pool = Executors.newSingleThreadExecutor();
// execute(Runnable command) 在未来某个时间执行给定的命令
pool.execute(new Runnable(){
//匿名内部类
@Override
public void run() {
for(int i=1;i<1000;i++)
{
try {
/*public int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、
在 0(包括)和指定值(不包括)之间均匀分布的 int 值
这里表示表示1到10秒里面增加1辆车*/
Thread.sleep( (new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Road.this.name: 这个name:表示要访问的是成员变量,不能在上面构造方法那里加final
vechicles.add(Road.this.name+"_"+i);
}
}} );
/*定时器
1
运用Executors public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行 corePoolSize - 池中所保存的线程数,即使线
程是空闲的也包括在内。
返回: 新创建的安排线程池 unit:度量单位
2
运行线程池的内容
ScheduledFuture<?> scheduleAtFixedRate(Runnable command,要执行的任务
long initialDelay, 首次执行的延迟时间
long period, 连续执行之间的周期
TimeUnit unit) initialDelay 和 period 参数的时间单位
*/
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
//匿名内部类,路的 内容
public void run() {
if(vechicles.size()>0)//判断路是否有车
{
boolean lighted =
Lamp.valueOf(Lamp.class,Road.this.name).isLingted();//得到路的灯
if(lighted)//判断是否是绿灯
{
System.out.println(vechicles.remove(0)+"is traversing");//最先来的车开走
}
}
}
},
1,
1,
TimeUnit.SECONDS//枚举的秒单位
);
}
}
package com.isoftstone.interview.traffic;
/*(二)Lamp类
1.系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
2.每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。
3.增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
*/
public enum Lamp {
//定义灯,有12条线,则有12个灯
S2N("N2S","S2W",false),S2W("N2E","W2E",false),W2E("E2W","W2N",false),W2N("E2S","S2N",false),
N2S(null,null,false),N2E(null,null,false),E2W(null,null,false),E2S(null,null,false),
S2E(null,null,true),N2W(null,null,true),W2S(null,null,true),E2N(null,null,true) ;
private String oppsite;
private String next;
private boolean lighted;
//构造方法
private Lamp( String oppsite, String next,boolean lighted){
this.oppsite = oppsite;
this.next = next;
this.lighted =lighted;
}
//判断是否是绿灯
public boolean isLingted()
{
return lighted;
}
//亮灯为绿色,亮灯
public void light()
{
this.lighted = true;
if(oppsite!=null)//判断第1个参数是否为null
{
Lamp.valueOf(oppsite).light();//启Lamp.valueOf(oppsite)对应的灯为亮,为绿
}
}
//熄灯,为红灯
public Lamp black()
{
this.lighted = false;
if(oppsite!=null)//判断第1个参数是否为null
{
Lamp.valueOf(oppsite).light();//启动对应的灯为红灯
}
Lamp nextLamp = null;
if(next!=null)//判断第2个参数是否为null
{
nextLamp = Lamp.valueOf(next);
nextLamp.light();////让下个灯为绿灯
}
return nextLamp;
}
}
package com.isoftstone.interview.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/*
(三)LampController类
1.整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
2.LampController构造方法中要设定第一个为绿的灯。
3.LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
源码如下:*/
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.black();
}
},
10,
10,
TimeUnit.SECONDS
);
}
}
package com.isoftstone.interview.traffic;
public class MainClss {
/**
* @param args
*
(四)MainClass类
1.用for循环创建出代表12条路线的对象。
2.接着创建出LampController对象。
源码如下:
*/
public static void main(String[] args) {
String[] directions = new String[]{
"S2N","S2W","W2E","W2N","N2S","N2E","E2N","E2S","S2E","N2W","W2S","E2N"
};
for(int i=0;i<directions.length;i++)
{
new Road(directions[i]);//加载12条路
}
new LampController();//启动灯的控制器
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
3688

被折叠的 条评论
为什么被折叠?



