车辆流向类
public class Way { List<Road> direction = new LinkedList<>(); Road r; //Object obj = new Object(); Way(Road r){ this.r=r; //模拟车辆不断随机上路的过程 ExecutorService pool = Executors.newSingleThreadExecutor(); pool.execute(new Runnable(){ public void run(){ for(int i=1;i<1000;i++){ try { Thread.sleep((new Random().nextInt(10) + 1) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } Way.this.r.n=i; direction.add(Way.this.r); } } }); //每隔一秒检查对应的灯是否为绿,是则放行一辆车 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable(){ public void run(){ if(direction.size()>0){ boolean lighted = Way.this.r.l.light; if(lighted){ if(Way.this.r.t==Trend.LEFT){ List<Way> lt = MainClass.ls; for(Way ll:lt){ if(ll.r.l.light&&ll.r.t==Trend.LINE){ if(ll.direction.size()<=0){ System.out.println("同向左转车辆开始通过"); Road ro = direction.remove(0);System.out.println(ro+" "+ro.t.toString()+" "+Way.this.r.n+"车次 ... moving"); } } } }else{ System.out.println("同向直行或右转车辆优先开始通过"); Road ro = direction.remove(0);System.out.println(ro+" "+ro.t.toString()+" "+Way.this.r.n+"车次 ... moving"); } } } } }, 1, 1, TimeUnit.SECONDS); } }
路向枚举类
public enum Road { N2S(Trend.LINE,Lamp.S),S2N(Trend.LINE,Lamp.N),W2E(Trend.LINE,Lamp.E),E2W(Trend.LINE,Lamp.W), N2E(Trend.LEFT,Lamp.S),E2S(Trend.LEFT,Lamp.W),S2W(Trend.LEFT,Lamp.N),W2N(Trend.LEFT,Lamp.E), N2W(Trend.RIGHT,Lamp.O),W2S(Trend.RIGHT,Lamp.O),S2E(Trend.RIGHT,Lamp.O),E2N(Trend.RIGHT,Lamp.O); private Road(Trend t,Lamp l){ this.t=t; this.l=l; } public Trend t; public Lamp l; public int n; }
车向枚举
public enum Trend { LINE,RIGHT,LEFT; }
路灯枚举类
public enum Lamp { N,S,W,E,O; public boolean light; public void green(){ O.light=true; switch(this){ case N : this.light=true;S.light=true; System.out.println("南北向变绿灯"); break; case W : this.light=true;E.light=true; System.out.println("东西向变绿灯"); break; default: break; } } public Lamp red(){ O.light=true; switch(this){ case N : this.light=false;S.light=false; System.out.println("南北向变红灯"); return W; case W : this.light=false;E.light=false; System.out.println("东西向变红灯"); return N; default: return this; } } }
路灯控制类
public class LampControl { Lamp currentLamp; LampControl(){ currentLamp = Lamp.N; currentLamp.green(); ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable(){ public void run(){ currentLamp = currentLamp.red(); currentLamp.green(); } }, 10, 10, TimeUnit.SECONDS); } }
主函数类
public class MainClass { public static List<Way> ls = new ArrayList<>(); public static void main(String[] args) { String [] directions = new String[]{ "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S" }; for(int i=0;i<directions.length;i++){ ls.add(new Way(Road.valueOf(directions[i]))); } new LampControl(); } }
运行结果
南北向变绿灯
同向左转车辆开始通过
S2W LEFT 1车次 ... moving
同向左转车辆开始通过
同向左转车辆开始通过
N2E LEFT 1车次 ... moving
同向左转车辆开始通过
同向直行或右转车辆优先开始通过
W2S RIGHT 1车次 ... moving
同向直行或右转车辆优先开始通过
N2S LINE 1车次 ... moving
同向直行或右转车辆优先开始通过
S2N LINE 1车次 ... moving
同向直行或右转车辆优先开始通过
S2E RIGHT 1车次 ... moving
同向直行或右转车辆优先开始通过
N2W RIGHT 1车次 ... moving
同向直行或右转车辆优先开始通过
S2N LINE 2车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 1车次 ... moving
同向直行或右转车辆优先开始通过
W2S RIGHT 2车次 ... moving
南北向变红灯
东西向变绿灯
同向直行或右转车辆优先开始通过
E2W LINE 2车次 ... moving
同向直行或右转车辆优先开始通过
W2E LINE 2车次 ... moving
同向直行或右转车辆优先开始通过
E2W LINE 2车次 ... moving
同向直行或右转车辆优先开始通过
W2E LINE 2车次 ... moving
同向左转车辆开始通过
W2N LEFT 1车次 ... moving
同向左转车辆开始通过
同向左转车辆开始通过
E2S LEFT 2车次 ... moving
同向左转车辆开始通过
E2S LEFT 2车次 ... moving
同向直行或右转车辆优先开始通过
W2E LINE 3车次 ... moving
同向直行或右转车辆优先开始通过
N2W RIGHT 2车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 2车次 ... moving
同向直行或右转车辆优先开始通过
W2S RIGHT 3车次 ... moving
同向直行或右转车辆优先开始通过
S2E RIGHT 2车次 ... moving
同向直行或右转车辆优先开始通过
E2W LINE 3车次 ... moving
同向左转车辆开始通过
E2S LEFT 3车次 ... moving
同向直行或右转车辆优先开始通过
W2S RIGHT 4车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 3车次 ... moving
同向直行或右转车辆优先开始通过
W2E LINE 4车次 ... moving
东西向变红灯
南北向变绿灯
同向直行或右转车辆优先开始通过
N2S LINE 3车次 ... moving
同向直行或右转车辆优先开始通过
S2N LINE 4车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 4车次 ... moving
同向直行或右转车辆优先开始通过
同向直行或右转车辆优先开始通过
S2N LINE 4车次 ... moving
N2S LINE 3车次 ... moving
同向直行或右转车辆优先开始通过
N2W RIGHT 3车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 5车次 ... moving
同向直行或右转车辆优先开始通过
S2N LINE 5车次 ... moving
同向直行或右转车辆优先开始通过
N2S LINE 4车次 ... moving
同向直行或右转车辆优先开始通过
S2E RIGHT 3车次 ... moving
同向直行或右转车辆优先开始通过
E2N RIGHT 6车次 ... moving
同向直行或右转车辆优先开始通过