黑马程序员-我自行改进的交通灯管理系统 -升级版

车辆流向类

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
同向直行或右转车辆优先开始通过


你可能感兴趣的:(黑马程序员-我自行改进的交通灯管理系统 -升级版)