A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© osully 金牌黑马   /  2014-3-26 17:51  /  838 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

日夜复习,只为进黑马.各种努力!以下是个人写的交通灯,请大牛帮忙分析分析,哪里好与不好!!!!多谢!!!!!!

  1. package TrafficLampDemo;

  2. public enum Lamp {
  3.         Lamp1, Lamp2, Lamp3, Lamp4;
  4.        
  5.         /* 一共有四种灯
  6.          * S2N,N2S        Lamp1
  7.          * S2W,N2E        Lamp2
  8.          * E2W,W2E        Lamp3
  9.          * E2S,W2N        Lamp4
  10.          */

  11.         //四种灯的顺序
  12.         public Lamp nextLamp() {
  13.                 switch (this) {
  14.                 case Lamp1:
  15.                         return Lamp2;
  16.                 case Lamp2:
  17.                         return Lamp3;
  18.                 case Lamp3:
  19.                         return Lamp4;
  20.                 case Lamp4:
  21.                         return Lamp1;
  22.                 }
  23.                 return null;
  24.         }

  25.        
  26.         //打印中文
  27.         public String toString() {
  28.                 String name = null;
  29.                 switch (this) {
  30.                 case Lamp1:
  31.                         name = "从南到北,从北到南";
  32.                         break;
  33.                 case Lamp2:
  34.                         name = "从南到西,从北到东";
  35.                         break;
  36.                 case Lamp3:
  37.                         name = "从东到西,从西到东";
  38.                         break;
  39.                 case Lamp4:
  40.                         name = "从东到南,从西到北";
  41.                         break;
  42.                 }
  43.                 return name;
  44.         }
  45. }
复制代码
  1. package TrafficLampDemo;

  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.TimeUnit;

  4. public class LampControl {
  5.        
  6.         //设置一个默认灯
  7.         private Lamp currentLamp = Lamp.Lamp1;
  8.        
  9.         //这个数组其实可以不写的,下面数字调用的就是这个数组的脚标
  10.         String[] roads = { "S2N", "S2W", "E2W", "E2S", "N2S", "N2E", "W2E", "W2N"};

  11.         //构造函数,新建对象时控制灯的转换
  12.         LampControl() {
  13.                 System.out.println(currentLamp+"绿灯了");
  14.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  15.                         public void run() {
  16.                                 System.out.println(currentLamp+"红灯了");
  17.                                 currentLamp = currentLamp.nextLamp();//10秒跳转灯
  18.                                 System.out.println(currentLamp+"绿灯了");
  19.                         }
  20.                 }, 10, 10, TimeUnit.SECONDS);
  21.         }

  22.         public void start() {
  23.                
  24.                 //每秒检查一次当前什么灯在亮
  25.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  26.                         public void run() {
  27.                                 switch (currentLamp) {
  28.                                 case Lamp1:
  29.                                         cross(0, 4);
  30.                                         break;
  31.                                 case Lamp2:
  32.                                         cross(1, 5);
  33.                                         break;
  34.                                 case Lamp3:
  35.                                         cross(2, 6);
  36.                                         break;
  37.                                 case Lamp4:
  38.                                         cross(3, 7);
  39.                                         break;
  40.                                 }
  41.                         }
  42.                 }, 1, 1, TimeUnit.SECONDS);
  43.         }

  44.         //绿灯的车1秒通过一个
  45.         public void cross(int x, int y) {
  46.                
  47.                 //两个相对应的方向
  48.                 Road road1 = Road.valueOf(roads[x]);
  49.                 Road road2 = Road.valueOf(roads[y]);
  50.                
  51.                 //判断是否有车,有车就过
  52.                 Integer num1 = road1.crossCar();
  53.                 Integer num2 = road2.crossCar();       
  54.                 if (num1 != null | num2 != null) {
  55.                         if (num1 != null) {
  56.                                 System.out.println(road1 + "的第" + num1 + "辆车开过去了");
  57.                         }
  58.                         if (num2 != null) {
  59.                                 System.out.println(road2 + "的第" + num2 + "辆车开过去了");
  60.                         }
  61.                         try {
  62.                                 Thread.sleep(900);
  63.                         }
  64.                         catch (InterruptedException e) {
  65.                                 e.printStackTrace();
  66.                         }
  67.                 }
  68.         }

  69. }
复制代码
  1. package TrafficLampDemo;

  2. import java.util.LinkedList;
  3. import java.util.Random;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.TimeUnit;

  6. public enum Road {
  7.         //S是南 N是北 W是西 E是东
  8.         S2N,S2W,E2W,E2S,
  9.         N2S,N2E,W2E,W2N,
  10.         S2E,E2N,N2W,W2S;
  11.        
  12.         int lastCar = 1;
  13.         //这里紧紧是增删操作,我觉得用LinkedList比较好
  14.         LinkedList<Integer> list = new LinkedList<Integer>();
  15.        
  16.         //每一个路都可以独立随机产生车辆
  17.         public synchronized void produceCar(){
  18.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
  19.                         public void run(){
  20.                                 list.addLast(lastCar++);
  21.                                
  22.                         }
  23.                 }, 1, new Random().nextInt(10)+1, TimeUnit.SECONDS);
  24.         }
  25.        
  26.         //让绿灯去调用,让车辆过
  27.         public synchronized Integer crossCar(){
  28.                 if(list.size()!=0){
  29.                         return list.removeFirst();
  30.                 }
  31.                 return null;
  32.         }
  33.        
  34.        
  35.         //打印中文
  36.         public String toString(){
  37.                 switch(this){
  38.                 case S2N:
  39.                         return "从南到北";
  40.                 case S2W:
  41.                         return "从南到西";
  42.                 case E2W:
  43.                         return "从东到西";
  44.                 case E2S:
  45.                         return "从东到南";
  46.                 case N2S:
  47.                         return "从北到南";
  48.                 case N2E:
  49.                         return "从北到东";
  50.                 case W2E:
  51.                         return "从西到东";
  52.                 case W2N:
  53.                         return "从西到北";
  54.                 case S2E:
  55.                         return "从南到东";
  56.                 case E2N:
  57.                         return "从东到北";
  58.                 case N2W:
  59.                         return "从北到西";
  60.                 case W2S:
  61.                         return "从西到南";
  62.                 }               
  63.                 return null;
  64.         }
  65. }
复制代码
  1. package TrafficLampDemo;

  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.TimeUnit;

  4. public class MainClass {
  5.         static int num ;
  6.         public static void main(String[] args) {
  7.                 final String[] roads = { "S2N", "S2W", "E2W", "E2S", "N2S", "N2E",
  8.                                 "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
  9.                
  10.                 // 每条路随机产生车辆
  11.                 for (int i = 0; i < roads.length; i++) {
  12.                         Road.valueOf(roads[i]).produceCar();
  13.                 }

  14.                 //此处是没有灯的右转模拟,如果想要看模拟就把注释打开
  15.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  16.                         public void run() {
  17.                                 for (int i = 8; i < roads.length; i++) {
  18.                                         Road road = Road.valueOf(roads[i]);
  19.                                         Integer num = road.crossCar();
  20.                                         if (num != null) {
  21.                                                 //System.out.println(road + "的第" + num + "辆车开过去了");
  22.                                                 try {
  23.                                                         Thread.sleep(1000);
  24.                                                 }
  25.                                                 catch (InterruptedException e) {
  26.                                                         e.printStackTrace();
  27.                                                 }
  28.                                         }                                       
  29.                                 }
  30.                         }
  31.                 }, 1, 1, TimeUnit.SECONDS);

  32.                 //开启交通灯控制
  33.                 new LampControl().start();

  34.         }
  35. }
复制代码




评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

3 个回复

倒序浏览
顶起来,
回复 使用道具 举报
表示还没学到这部分哈 。。。。。。
回复 使用道具 举报
来个大牛帮小弟分析一下吧!!!多谢指点啊!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马