-----<a target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
这个 帖子接交通灯管理系统(1)。
以下是根据具体代码对各种类的分析:
产生车辆的Road类:
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
// TODO Auto-generated method stub
List<String> vechicles=new ArrayList<String>();//集合,用来产生带名字的车辆
private String name;//用来标识这个Road的名称
public Road(String name){
this.name=name;
ExecutorService pool=Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){//这个方法是产生车的线程。
for(int i=1;i<1000;i++){
try {
int random= new Random().nextInt(10);
Thread.sleep((random+1)*1000);
vechicles.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(!vechicles.isEmpty()){//判断可通行的路上的车有没有
boolean lighted=Lamp.valueOf(Road.this.name).isLighted();//有的话,再判断这个线路是否可以通行呢
if(lighted){
System.out.println(vechicles.remove(0)+" is tranversing!");//若可以通行,则通行
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
控制车辆运行的灯的类Lamp:
public enum Lamp {
//先把灯的各种类型枚举出来
S2N("N2S","S2W",false),S2W("W2S","E2W",false),E2W("W2E","E2S",false),E2S("S2E","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 Lamp(String opposite,String next,boolean lighted){//定义一个包含对方向的灯、下个时刻要亮的灯、灯是否亮的标志的构造函数
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
private Lamp(){
}
private boolean lighted;//指示灯的状态 (能不能通行)
private String opposite; //指示对面的灯
private String next;//指示下一时刻要亮的灯
public boolean isLighted(){//一个公共方法,判断这个灯是否亮了
return lighted;
}
public void light(){//点亮本灯的方法
this.lighted=true;//把本灯点亮
if(this.opposite!=null)//判断对面的灯是否为空,然后把对面的灯也点亮 ,这个 判断不可缺少,如果缺少,就会陷入循环调用light()方法的死循环
Lamp.valueOf(opposite).light();
}
public Lamp blackOut(){//把本灯熄灯,同时把对面的灯熄灭,同时,返回下一个灯,这也是为了方便控制,返回下一个要点亮的灯。
this.lighted=false;
if(this.opposite!=null)
Lamp.valueOf(opposite).blackOut();
if(this.next!=null)
Lamp.valueOf(next).light();
return Lamp.valueOf(next);
}
}
控制灯运行方式的LampController类:
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();//把当前的灯由false改为true,就是
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//创建线程池
timer.scheduleAtFixedRate(//周期运行一个线程
new Runnable(){
public void run(){
currentLamp=currentLamp.blackOut();
}
}, 10, 10, TimeUnit.SECONDS);
}
}
启动程序的MainClass方法:
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] directions=new String[]{
"S2N","S2W","S2E","E2N","E2S","E2W","N2S","N2E","N2W","W2S","W2E","W2N"
};//列出类的名称
for(String i:directions)
new Road(i);//通过名称实例化出各Road类
new LampController();//实例化出控制系统
}
}
|
|