自己设想的另一种设计思路,拿出来分享,欢迎指摘批评
1.设计思路
* 路的通行状态,有四种:
* 1.南北(北南)直行, 记为SA,
* 2.南西(北东)左转, 记为SB,
* 3.西东(东西)直行, 记为SC,
* 4.西北(东南)左转, 记为SD,
* 每种状态包含二个方向上的灯控通行线路:
* SA: S2N, N2S
* SB: S2W, N2E
* SC: W2E, E2W
* SD: W2N, E2S
* 右转线路不受灯控,设计为包含在每种状态中,有四个方向:
* S2E, W2S, N2W, E2N
2.代码实现
public enum TrafficState
{
SA, SB, SC, SD;
/*private TrafficState()
{
SA.addRoad(road)
String[] rightTurns = "S2E,W2S,N2W,E2N".split(",");
for(int i=0; i<rightTurns.length; i++)
{
TrafficState.values()[i].addRoad(new Road(rightTurns[i]));
}
}*/
private ArrayList<Road> roads = new ArrayList<Road>(6);//每种状态在2+4个方向上有通行线路
/*public void init()
{
//初始化各個狀態常量
//將右轉路線添加到所有狀態
}*/
public TrafficState nextState()
{
return TrafficState.values()[(this.ordinal()+1)%4];//按索引取下一个状态值
}
public void addRoad(Road road)
{
roads.add(road);
}
public void stateChanged(TrafficState lastState)
{
if(null != lastState)//非初始狀態
{
stop(lastState);
}
traffic();
}
private void stop(TrafficState lastState)
{
//先關閉上一個狀態的交通
for(Road road : lastState.roads)
{
road.offTraffic();
}
try
{
Thread.sleep(1000); //休息一下,让上一状态的车过完
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("State:"+lastState.name()+"-->"+this.name());
}
/*
* 打開本狀態的交通
*/
private void traffic()
{
for(Road road : roads)
{
road.onTraffic();
}
}
}
public class Road
{
//private static ExecutorService service = Executors.newSingleThreadExecutor();
private String name; //代表那个线路方向上的车
private boolean isGreen = true; //是否是綠燈
private LinkedList<String> vehicles = new LinkedList<String>(); //路上的车辆.链表对添加,删除高效
public Road(String roadName)
{
this.name = roadName;
//模拟路上的不断来的车辆
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable()
{
@Override
public void run()
{
for(int i=0; i<1000; i++)
{
//时隔(0-1)随机秒数来1辆车
try
{
Thread.sleep(new Random().nextInt(1000)+1);//休息的目的是让cpu为其它线路上也产生车
} catch (InterruptedException e)
{
e.printStackTrace();
}
//将车名加到数组中。车名:路名_序号
vehicles.add(Road.this.name + "_" + i);
}
}
});
}
public void onTraffic()
{
ExecutorService service = Executors.newSingleThreadExecutor();//优化:静态变量 缓冲池
service.execute(new Runnable(){
@Override
public void run()
{
isGreen = true;
while(isGreen)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(vehicles.size() > 0)
System.out.println(vehicles.pollFirst() + " has passed!");;
}
}});
}
public void offTraffic()//优化:wait() on the state condition
{
isGreen = false;
}
}
/*
* 控制的灯的变化
*/
public class TrafficStateController
{
private TrafficState currentState;
private TrafficState lastState;
public TrafficStateController(TrafficState currentState)
{
this.currentState = currentState;
this.lastState = null;
System.out.println("initial state:"+this.currentState);
this.currentState.stateChanged(lastState);
}
/**
* 启动交通灯系统
*/
public void start()
{
//每隔5秒改变下状态
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(
new Runnable()
{
@Override
public void run()
{
TrafficStateController.this.lastState =
TrafficStateController.this.currentState;
TrafficStateController.this.currentState =
TrafficStateController.this.currentState.nextState();
//通知状态改变
TrafficStateController.this.currentState
.stateChanged(TrafficStateController.this.lastState);
}
},
5,
5,
TimeUnit.SECONDS);
}//end start
}//end class
public class MainClass
{
/**
* 設置交通燈系統,并啟動
* @param args
*/
public static void main(String[] args)
{
// 初始化方向線路
String[] roadNames =
{
"S2N", "N2S", "S2W", "N2E",
"W2E", "E2W", "W2N", "E2S",
"S2E", "W2S", "N2W", "E2N"
};
Road[] roads = new Road[roadNames.length];
Road road = null;
for(int i=0; i<roadNames.length; i++)
{
road = new Road(roadNames[i]);
roads[i] = road;
}
//添加線路到相應的狀態,相當于粉絲找達人,
TrafficState.SA.addRoad(roads[0]);
TrafficState.SA.addRoad(roads[1]);
TrafficState.SB.addRoad(roads[2]);
TrafficState.SB.addRoad(roads[3]);
TrafficState.SC.addRoad(roads[4]);
TrafficState.SC.addRoad(roads[5]);
TrafficState.SD.addRoad(roads[6]);
TrafficState.SD.addRoad(roads[7]);
//右轉是所有狀態的忠實粉絲
for(int i=8; i<12; i++)
{
TrafficState.SA.addRoad(roads[i]);
TrafficState.SB.addRoad(roads[i]);
TrafficState.SC.addRoad(roads[i]);
TrafficState.SD.addRoad(roads[i]);
}
//啟動交通燈系統
new TrafficStateController(TrafficState.SA).start();
}
}
-------
android培训
、
java培训
、期待与您交流! ----------