黑马Java学习笔记之-----交通灯管理系统
---------------------- android培训、java培训、期待与您交流! ----------------------
模拟实现十字路口的交通等管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆:
例如:
由南向而来,去往北向的车辆。。。直行
由西向而来,去往南向的车辆。。。右转
由东向而来,去往南向的车辆。。。左转
信号灯忽略黄灯,只考虑红灯和绿灯
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行,直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒
(提示:可通过线程Sleep的方式模拟)
LampController类的编写
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯
LampController对象的start方法中将当前灯变绿,然后启动一个定时10秒将当前灯变红和将下一个灯变绿。
总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
Road类:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Random; 4 import java.util.concurrent.ExecutorService; 5 import java.util.concurrent.Executors; 6 import java.util.concurrent.ScheduledExecutorService; 7 import java.util.concurrent.TimeUnit; 8 9 /** 10 * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。 11 * 每条路线上随机增加新的车辆,增加到一个集合中保存。 12 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。 13 * @author 14 * 15 */ 16 public class Road { 17 private List<String> vechicles = new ArrayList<String>(); 18 19 private String name =null; 20 public Road(String name){ 21 this.name = name; 22 23 //模拟车辆不断随机上路的过程 24 ExecutorService pool = Executors.newSingleThreadExecutor(); 25 pool.execute(new Runnable(){ 26 public void run(){ 27 for(int i=1;i<1000;i++){ 28 try { 29 Thread.sleep((new Random().nextInt(10) + 1) * 1000); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 vechicles.add(Road.this.name + "_" + i); 34 } 35 } 36 37 }); 38 39 //每隔一秒检查对应的灯是否为绿,是则放行一辆车 40 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); 41 timer.scheduleAtFixedRate( 42 new Runnable(){ 43 public void run(){ 44 if(vechicles.size()>0){ 45 boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); 46 if(lighted){ 47 System.out.println(vechicles.remove(0) + " is traversing !"); 48 } 49 } 50 51 } 52 }, 53 1, 54 1, 55 TimeUnit.SECONDS); 56 57 } 58 }
Lamp类:
1 /** 2 * 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12个Lamp元素。 3 * 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红,所以, 4 * 程序代码只需要控制每组灯中的一个灯即可: 5 * s2n,n2s 6 * s2w,n2e 7 * e2w,w2e 8 * e2s,w2n 9 * s2e,n2w 10 * e2n,w2s 11 * 上面最后两行的灯是虚拟的,由于从南向东和从西向北、以及它们的对应方向不受红绿灯的控制, 12 * 所以,可以假想它们总是绿灯。 13 * @author14 * 15 */ 16 /**/ 17 18 public enum Lamp { 19 /*每个枚举元素各表示一个方向的控制灯*/ 20 S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), 21 /*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/ 22 N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), 23 /*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/ 24 S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); 25 26 private Lamp(String opposite,String next,boolean lighted){ 27 this.opposite = opposite; 28 this.next = next; 29 this.lighted = lighted; 30 } 31 32 33 /*当前灯是否为绿*/ 34 private boolean lighted; 35 /*与当前灯同时为绿的对应方向*/ 36 private String opposite; 37 /*当前灯变红时下一个变绿的灯*/ 38 private String next; 39 public boolean isLighted(){ 40 return lighted; 41 } 42 43 /** 44 * 某个灯变绿时,它对应方向的灯也要变绿 45 */ 46 public void light(){ 47 this.lighted = true; 48 if(opposite != null){ 49 Lamp.valueOf(opposite).light(); 50 } 51 System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!"); 52 53 } 54 55 /** 56 * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿 57 * @return 下一个要变绿的灯 58 */ 59 public Lamp blackOut(){ 60 this.lighted = false; 61 if(opposite != null){ 62 Lamp.valueOf(opposite).blackOut(); 63 } 64 65 Lamp nextLamp= null; 66 if(next != null){ 67 nextLamp = Lamp.valueOf(next); 68 System.out.println("绿灯从" + name() + "-------->切换为" + next); 69 nextLamp.light(); 70 } 71 return nextLamp; 72 } 73 }
LampController类:
1 import java.util.concurrent.Executors; 2 import java.util.concurrent.ScheduledExecutorService; 3 import java.util.concurrent.TimeUnit; 4 5 public class LampController { 6 private Lamp currentLamp; 7 8 public LampController(){ 9 //刚开始让由南向北的灯变绿; 10 currentLamp = Lamp.S2N; 11 currentLamp.light(); 12 13 /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/ 14 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); 15 timer.scheduleAtFixedRate( 16 new Runnable(){ 17 public void run(){ 18 System.out.println("来啊"); 19 currentLamp = currentLamp.blackOut(); 20 } 21 }, 22 10, 23 10, 24 TimeUnit.SECONDS); 25 } 26 }
MainClass类:
1 public class MainClass { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 /*产生12个方向的路线*/ 9 String [] directions = new String[]{ 10 "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S" 11 }; 12 for(int i=0;i<directions.length;i++){ 13 new Road(directions[i]); 14 } 15 16 /*产生整个交通灯系统*/ 17 new LampController(); 18 } 19 20 }
---------------------- android培训、java培训、期待与您交流! ----------------------