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