张老师面试题讲解——交通信号灯
?------- android培訓、java培訓、期待與您交流! ----------
?
今天看了張老師的這個面試題講解才感覺到自己在一個什么水平,繼續努力學習,還需不斷提升自己的能力!
繼續學習鞏固一些知識,對線程池的認識以及對定時器的熟練掌握。各個知識點融會貫通才能成為一名優秀的程序員。
?
交通信號燈題目及要求
1.異步隨機生成按照各個路線行駛的車輛。
例如:
???????由南向而來去往北向的車輛?----?直行車輛
???????由西向而來去往南向的車輛?----?右轉車輛
???????由東向而來去往南向的車輛?----?左轉車輛
???????。。。
2.?信號燈忽略黃燈,只考慮紅燈和綠燈。
3.?應考慮左轉車輛控制信號燈,右轉車輛不受信號燈控制。
4.具體信號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
注:南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而后放行左轉車輛。
5. 每輛車通過路口時間為1秒(提示:可通過線程Sleep的方式模擬)。
6. 隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設置。
7. 不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程序運行結果。
畫圖分析:
分析對象,原則:誰擁有數據,誰就對外提供操作這些數據的方法。
路對象:
通過線程時間隨機地產生汽車并存入集合眾,跟據交通信號燈的變化移除汽車。
燈對象:
圖中共有12條路線 , 就可以看作為12個固定的交通燈 ,由于每次都是在操作同一對象, 所以運用用Enum枚舉類就更加方便。,
由于向右拐彎是不受燈控制的 , 所以4條右轉彎的燈一直為綠(true) ,? 在剩下的8條路線中 , 路線是兩兩對應的? , S2N-N2S , S2W-N2E ,W2E-E2W , E2S-W2N , 并且第一組燈變紅(false)時 , 第二組燈就變綠(true) , 依次往復 , 這樣就明確的燈的對應和交替關系 。
信號燈控制器:
添加定時器,控制紅綠燈變化。
路的代碼:
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 {private List<String> vehicles = new ArrayList<String>(); //創建集合,用來存放產生的汽車String roadName = null;Road(String roadName){ //路的構造方法this.roadName = roadName; ExecutorService pool = Executors.newSingleThreadExecutor(); //學習Executors類,創建獨立線程。Java1.5 pool.execute(new Runnable(){ //匿名內部類@Overridepublic void run() {for(int i=1; i<1000; i++){try {Thread.sleep((new Random().nextInt(10)+1)*1000); //} catch (InterruptedException e) {e.printStackTrace();}//把車放進集合中vehicles.add(Road.this.roadName+"_"+i); //外部類的局部變量的訪問方式:外部類名.this.變量名 }}});ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); //定義一個計劃的線程池,線程的數量為1//創建并執行此線程池,初始可以定時、并且后續具有周期性的方法.//用于當交通燈為綠色時,移出當前路上的車輛timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {if(vehicles.size()!=0){ boolean lighted = Lamp.valueOf(Road.this.roadName).isLighted();if(lighted){System.out.println(vehicles.remove(0)+" is traversing");}}} },1,1,TimeUnit.SECONDS);} }信號燈:
public enum Lamp {//前四個燈為主控燈,括號內傳入的分別是,"對應的燈","下一個燈",燈默認值S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),//中間四個燈為上面四個燈所對應的燈,并受其控制N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),//后四個為右轉彎的燈,為常綠狀態S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);private Lamp(String opposite,String next,boolean lighted){this.opposite = opposite;this.next = next;this.lighted = lighted;}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(this.name()+"lamp is green");}//燈變紅方法public Lamp lightOff(){this.lighted = false;if(opposite != null){Lamp.valueOf(opposite).lightOff();}System.out.println(next);Lamp nextLamp = null;if(next != null){System.out.println("綠燈由"+name()+"變成"+next); nextLamp = Lamp.valueOf(next);//System.out.println("test");nextLamp.light();}return nextLamp;} }信號燈控制器:
public class LampController {private Lamp currentLamp = null;public LampController(){currentLamp = Lamp.S2N; //定義初始變綠方向的燈currentLamp.lightOn();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); //添加定時器,根據實際邏輯紅綠燈不斷交替timer.scheduleAtFixedRate(new Runnable(){public void run(){currentLamp = currentLamp.lightOff(); //lightOff返回下一個當前狀態等}},10, 10,TimeUnit.SECONDS);} }編寫住方法實現功能:
public class MainClass {public static void main(String[] args) {String[] roadNames = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(String roadName : roadNames){new Road(roadName);}new LampController();} }
?
?
總結
以上是生活随笔為你收集整理的张老师面试题讲解——交通信号灯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统-进程同步和进程互斥
- 下一篇: STM32移相全桥电源方案