黑马视频学习-交通灯

来源:互联网 发布:ubuntu磁盘空间不足 编辑:程序博客网 时间:2024/04/28 09:43
 

---------------------- android培训、java培训、期待与您交流! ----------------------
今晚学习了交通灯的视频,

感觉老师的代码很简练很实用。

不知道要多久才能像张老师一样牛。

交通灯的问题,首先要创建一个路的对象,要实现几个功能。

路口有很多个方向,每个方向当绿灯时就应该有可能有车通过。

package com.isoftstone.interview.traffic;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {List<String> vechicles = new ArrayList<String>();private String name = null;public Road(String name) {this.name = name;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();}vechicles.add(Road.this.name + "_" + i);}}});ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {public void run() {if (vechicles.size() > 0) {boolean lighted = Lamp.valueOf(Road.this.name).isLighted();if (lighted) {System.out.println(vechicles.remove(0) + " is traversing!");}}}}, 1, 1, TimeUnit.SECONDS);}}


还要有灯对象,这里老师用的是枚举。

因为灯一共有12个方向,其中右转是一直都可以通行。

当南向直行可以通行的时候北向直行也应可以通行。

同样的南向左转的时候北向左转也一样应可以通行。

这里灯要有这样几个方法,灯转绿,灯转红。其中变成红灯的时候要将下一个方向的灯变绿。

这里面的构造方法需要传3个参数和其一致变化的方向,变红的时候变绿的方向,灯的初始状态。

package com.isoftstone.interview.traffic;// SM南向直行,SL南向左转,EM东向直行,EL东向左转,// NM北向直行,NL北向左转,WM西向直行,WL系向左转,// SR南向右转,ER东向右转,NR北向右转,WR西向右转.public enum Lamp {SM("NM", "SL", false), SL("NL", "EM", false), EM("WM", "EL", false), EL("WL", "SM", false), NM(null, null, false), NL(null, null, false), WM(null, null, false), WL(null, null, false), SR(null, null, true), ER(null, null, true), NR(null, null, true), WR(null, null, true);private Lamp(String opposite, String next, boolean lighted) {this.opposite = opposite;this.next = next;this.lighted = lighted;}private Lamp() {}private boolean lighted;private String opposite;private String next;public boolean isLighted() {return lighted;}public void light() {this.lighted = true;if (opposite != null)Lamp.valueOf(opposite).light();System.out.println(name() + "lamp is green.");}public Lamp blackOut() {this.lighted = false;if (opposite != null)Lamp.valueOf(opposite).blackOut();System.out.println(name() + "lamp is red.");Lamp nextLamp = null;if (next != null) {nextLamp = Lamp.valueOf(next);nextLamp.light();}return nextLamp;}}


灯和路都有了,现在我们还需要一个控制器。

它要实现的功能是,哪个方向先行,多少秒之后换方向。

在这里我们要做的还有当一个灯变红的时候,要获取下一个变绿的灯。

张老师讲最好的办法就是然变红的方法返回变绿的灯。

这样问题就很简单了。

package com.isoftstone.interview.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampController {private Lamp currentLamp;public LampController() {currentLamp = Lamp.SM;currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run() {currentLamp = currentLamp.blackOut();}},10,10,TimeUnit.SECONDS);}}


这些都完成以后,问题就简单很多了。

我们要创建一个MainClass,来实现这个交通系统的运作。

package com.isoftstone.interview.traffic;public class MainClass {public static void main(String[] args) {String[] directions = new String[] { "SM", "SL", "EM", "EL", "NM", "NL", "WM","WL", "SR", "ER", "NR", "WR" };for (int i = 0; i < directions.length; i++) {new Road(directions[i]);}new LampController();}}


跟着老师学习了整个交通系统的编译过程。

看起来很简单,但是关掉视频之后自己写起来还是有很多写不出来的地方。

自己学的知识还不够丰富,而且学的太死板。

真希望能够加入第五期的学习,让自己能够更快的成长起来。

---------------------- android培训、java培训、期待与您交流! ----------------------

原创粉丝点击