------- android培训、java培训、期待与您交流! ----------
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
Ø 异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
Ø 信号灯忽略黄灯,只考虑红灯和绿灯。
Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
现在先看看分析图:
首先建立一个枚举,用于存放12个信号灯的数据,并在枚举中提供获取现在灯的状态和对等进行操作的方法
1. package com.itheima.trafficlamp; 2. 3. public enum Lemp { 4. 5. S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","S2W",false),E2S("W2N","S2N",false), 6. N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), 7. S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); 8. 9. //灯是否点亮 10. private boolean lighted; 11. //相对应灯的名称 12. private String oppostie; 13. //下一个灯的名称 14. private String nextLamp; 15. 16. //定义构造函数,初始化枚举对象 17. private Lemp(String oppostie,String nextLamp,boolean lighted){ 18. 19. this.oppostie = oppostie; 20. this.nextLamp = nextLamp; 21. this.lighted = lighted; 22. 23. 24. } 25. 26. //提供一个方法,判断先在灯的状态 27. public boolean isLight(){ 28. return this.lighted; 29. } 30. 31. 32. //点亮一盏灯,即将灯变为绿灯,如果存在相对应的灯,则也点亮想对应的灯 33. public void light(){ 34. 35. this.lighted = true; 36. if(oppostie != null){ 37. Lemp.valueOf(oppostie).light(); 38. } 39. System.out.println(this.name()+"——————————变为绿灯————————————"); 40. 41. } 42. 43. //关闭一盏灯,即将灯变为红灯,如果有想对应的灯存在,则将对应的灯也关闭, 44. //如果该灯存在下一个灯,则将下一个灯点亮,即将下一个灯变为绿灯 45. public void blackOut(){ 46. this.lighted = false; 47. if(this.oppostie != null){ 48. Lemp.valueOf(oppostie).blackOut(); 49. } 50. 51. if(this.nextLamp != null){ 52. Lemp.valueOf(nextLamp).light(); 53. } 54. } 55. 56. 57. } |
再建立一个线路的类,用于存放线路的信息,并可以根据灯的变化操作路上的车辆通过
1. package com.itheima.trafficlamp; 2. 3. import java.util.ArrayList; 4. import java.util.List; 5. import java.util.Random; 6. import java.util.concurrent.ExecutorService; 7. import java.util.concurrent.Executors; 8. import java.util.concurrent.ScheduledExecutorService; 9. import java.util.concurrent.TimeUnit; 10. 11. public class Road { 12. 13. private String roadName; 14. private List<String> cars = new ArrayList<String>(); 15. 16. public Road(String roadName){ 17. this.roadName = roadName; 18. 19. //模拟车辆不断随即上路的过程 20. //获取一个单个线程的线程池 21. ExecutorService pool = Executors.newSingleThreadExecutor(); 22. 23. //开启一个线程 24. pool.execute(new Runnable() { 25. 26. @Override 27. public void run() { 28. for (int i = 0; i < 1000; i++) { 29. try { 30. Thread.sleep((new Random().nextInt(10)+1)*1000); 31. } catch (InterruptedException e) { 32. e.printStackTrace(); 33. } 34. cars.add(Road.this.roadName+":::::"+i); 35. } 36. 37. } 38. }); 39. 40. //使用定时器隔一秒检查一次是否为绿灯,是,则放行一辆车 41. ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(); 42. timer.scheduleAtFixedRate( 43. new Runnable() { 44. 45. @Override 46. public void run() { 47. if(cars.size()>0){ 48. boolean lighted = Lemp.valueOf(Road.this.roadName).isLight(); 49. if(lighted){ 50. System.out.println(cars.remove(0)+"通过了"); 51. } 52. 53. } 54. 55. } 56. }, 57. 58. 59. TimeUnit.SECONDS); 60. 61. 62. } 63. 64. } |
建立一个交通灯控制类,用于控制灯的变化
1. package com.itheima.trafficlamp; 2. 3. import java.util.concurrent.Executors; 4. import java.util.concurrent.ScheduledExecutorService; 5. import java.util.concurrent.TimeUnit; 6. 7. public class LampContro { 8. 9. private Lemp currentLemp; 10. public LampContro(){ 11. 12. //最初状态使南向北的灯点亮,即变为绿灯 13. currentLemp = Lemp.S2N; 14. currentLemp.light(); 15. 16. //定义一个定时器,每隔15秒,变换灯的颜色 17. ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(); 18. 19. timer.scheduleAtFixedRate( 20. new Runnable() { 21. 22. @Override 23. public void run() { 24. currentLemp.blackOut(); 25. 26. } 27. }, 28. 29. 30. TimeUnit.SECONDS); 31. 32. } 33. 34. } |
最后建立主函数,创建所有的12路线,并启动交通同控制器:
1. package com.itheima.trafficlamp; 2. 3. public class Begin { 4. 5. /** 6. * @param args 7. */ 8. public static void main(String[] args) { 9. // TODO Auto-generated method stub 10. //用一个数组接受 11. String [] roadNames = new String[]{"S2N","S2W","E2W","E2S", 12. "N2S","N2E","W2E","W2N", 13. "S2E","E2N","N2W","W2S"}; 14. 15. for(String roadName : roadNames){ 16. new Road(roadName); 17. 18. } 19. 20. new LampContro(); 21. 22. } 23. 24. }
|
------- android培训、java培训、期待与您交流! ----------