黑馬程式設計師——7K面試題交通燈(My)
------- android培訓、java培訓、期待與您交流! ----------
模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:
1、非同步隨機生成按照各個路線行駛的車輛。
例如:
由南向而來去往北向的車輛 ---- 直行車輛
由西向而來去往南向的車輛 ---- 右轉車輛
由東向而來去往南向的車輛 ---- 左轉車輛
。。。
2、訊號燈忽略黃燈,只考慮紅燈和綠燈。
3、應考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制。
4、具體訊號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
注:南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而後放行左轉車輛。
5、每輛車通過路口時間為1秒(提示:可通過執行緒Sleep的方式模擬)。
6、隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設定。
7、不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。
以上是需要做的題,但是呢!!我自己將題目該了一下。還請老師幫忙看一下程式碼以及執行效果。(不執行隨時右轉,必須按照紅綠燈指示)
以下是我畫了一張圖:
從我的題中要求得知,紅綠燈 只能允許 一面 行動,而且他行動的方位 只有3個方向。
我的思考方式:我有一個控制器,該控制器控制著 (東南西北) 4組 紅綠燈。每一組紅綠燈都對應著對面的路
當 南面 為 紅燈時,只允許 北面車 行動,
當 東面 為 紅燈時,只允許 西面車 行動,
當 北面 為 紅燈時,只允許 南門車 行動,
當 西面 為 紅燈時,只允許 東面車 行動。
東南西北都有隨時隨地來的車。(通過4個執行緒開啟,每一個執行緒都對應著自己的那條路,隨機時間產生隨機車)當 允許行動的那條路線可以行動時,則進行 1秒 remove 一輛車。
我的程式碼展示:
lamp類:每一個燈都有自己的固定時間,然後有一個返回下一個燈的時間(主要是來源於 張老師第一次將 enum 那個時候就想做紅綠燈了)
public enum Lamp { RED(10){ public Lamp nextLamp() { return GREEN_3; } }, GREEN_3(30){ public Lamp nextLamp() { return RED; } }, GREEN_2(20) { public Lamp nextLamp() { return RED; } }, GREEN_1(10) { public Lamp nextLamp() { return RED; } }; protected int time; private Lamp(int time) { this.time = time; } public abstract Lamp nextLamp(); }
Roud類:只有路才知道 有 多少輛車,只有路才能將車移動。(面向物件設計)
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Roud
{
List<String> s = new ArrayList<String>(); //南
List<String> w = new ArrayList<String>(); //西
List<String> n = new ArrayList<String>(); //北
List<String> e = new ArrayList<String>(); //東
/**只要一被建立物件,我就開啟4執行緒。
* */
Roud()
{
new Thread(new RoudAddCar(s, "s")).start(); //傳入集合,和 路面
new Thread(new RoudAddCar(w, "w")).start();
new Thread(new RoudAddCar(n, "n")).start();
new Thread(new RoudAddCar(e, "e")).start();
}
//路要和刪除的方法。
public void removeCar(List<String> list, String roudName)
{
if(list.size()>0)
{
list.remove(0);
System.out.println(roudName + " _ remove a car , 待過的還有 : " + list.size());
}
}
}
class RoudAddCar implements Runnable //新增車輛執行緒
{
private String roudName;
private List<String> list;
public void run()
{
for(int i=1; list.size()<500 ; i++) //單條路線大於500就該請交警隊了
{
try
{
Thread.sleep( (new Random().nextInt(10) + 1)*1000 ); //1~10,在乘以1000,在1~10秒內隨機時間內產生車輛
list.add(roudName + "_" + i );
System.out.println(roudName + " add one");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
RoudAddCar(List<String> list,String roudName)
{
this.list = list;
this.roudName = roudName;
}
}
Monitor類 : 控制器控制 燈,燈控制路,路控制車。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Monitor
{
Roud roud = new Roud();
public Lamp sLamp = Lamp.RED; //南
public Lamp wLamp = Lamp.GREEN_3; //西 對應 東
public Lamp nLamp = Lamp.GREEN_2; //北 對應 南
public Lamp eLamp = Lamp.GREEN_1; //東 對應 西
public void energization() //控制器通電後開啟4執行緒。
{
ExecutorService pools = Executors.newFixedThreadPool(1);
pools.execute(new Runnable(){
public void run()
{
while(true)
{
if(sLamp == Lamp.RED) //南s 對應 北n,讓 北面的車走。
{
System.out.println("RED等切換為:S 面,只 允許 N 面開車");
int time = sLamp.time;
while(time>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("S 面,Led---------->true: " + --time + "秒");
roud.removeCar(roud.n, "N");
}
}
sLamp = sLamp.nextLamp();<span style="white-space:pre"> //當 time<=0的時候。就切換燈
}
else
{
int overTime = sLamp.time;
while(overTime>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("S 面,Led---->false: " + --overTime + "秒");
}
}
sLamp = sLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//當 time<=0的時候。就切換燈</span>
}
}
}
});
ExecutorService poolw = Executors.newFixedThreadPool(1);
poolw.execute(new Runnable(){
public void run()
{
while(true)
{
if(wLamp == Lamp.RED) //西w 對應 東e,讓 東面的車走。
{
System.out.println("RED等切換為:W 面,只允許 E 面開車 ");
int time = wLamp.time;
while(time>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("W 面,Led---------->true: " + --time + "秒");
roud.removeCar(roud.e, "E");
}
}
<span style="font-family: Arial, Helvetica, sans-serif;">sLamp = sLamp.nextLamp();//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
else
{
int overTime = wLamp.time;
while(overTime>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("W 面,Led---->false: " + --overTime + "秒");
}
}
wLamp = wLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
}
}
});
ExecutorService pooln = Executors.newFixedThreadPool(1);
pooln.execute(new Runnable(){
public void run()
{
while(true)
{
if(nLamp == Lamp.RED) //北n 對應 南s,讓 南面的車走。
{
System.out.println("RED等切換為:N 面,只允許 S 面 開車");
int time = nLamp.time;
while(time>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("N 面, Led---------->true: " + --time + "秒");
roud.removeCar(roud.s, "S");
}
}
nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
else
{
int overTime = nLamp.time;
while(overTime>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("N 面,Led---->false: " + --overTime + "秒");
}
}
nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
}
}
});
ExecutorService poole = Executors.newFixedThreadPool(1);
poole.execute(new Runnable(){
public void run()
{
while(true)
{
if(eLamp == Lamp.RED) //東e 對應 西w,讓 西面的車走。
{
System.out.println("RED等切換為:E 面,只允許 W 面 開車 ");
int time = eLamp.time;
while(time>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("E 面, Led---------->true: " + --time + "秒");
roud.removeCar(roud.w, "W");
}
}
eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
else
{
int overTime = eLamp.time;
while(overTime>0)
{
threadSleep();
synchronized(Monitor.class)
{
System.out.println("E 面,Led---->false: " + --overTime + "秒");
}
}
eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>
}
}
}
});
}
public void threadSleep() // 車輛過的時候需要停留1秒鐘
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
MainClass類:建立控制器物件。呼叫 通電方法 。讓程式跑起來。
public class MainClass {
public static void main(String[] args)
{
new
}
}
下次是程式部分執行的結果:
RED等切換為:S 面,只 允許 N 面開車
S 面,Led---------->true: 9秒
N 面,Led---->false: 19秒
W 面,Led---->false: 29秒
E 面,Led---->false: 9秒
S 面,Led---------->true: 8秒
W 面,Led---->false: 28秒
N 面,Led---->false: 18秒
E 面,Led---->false: 8秒
S 面,Led---------->true: 7秒
N 面,Led---->false: 17秒
W 面,Led---->false: 27秒
E 面,Led---->false: 7秒
s add one
n add one
S 面,Led---------->true: 6秒
N _ remove a car , 待過的還有 : 0
N 面,Led---->false: 16秒
W 面,Led---->false: 26秒
E 面,Led---->false: 6秒
n add one
w add one
S 面,Led---------->true: 5秒
N _ remove a car , 待過的還有 : 0
W 面,Led---->false: 25秒
N 面,Led---->false: 15秒
E 面,Led---->false: 5秒
e add one
S 面,Led---------->true: 4秒
N 面,Led---->false: 14秒
W 面,Led---->false: 24秒
E 面,Led---->false: 4秒
S 面,Led---------->true: 3秒
N 面,Led---->false: 13秒
W 面,Led---->false: 23秒
E 面,Led---->false: 3秒
S 面,Led---------->true: 2秒
N 面,Led---->false: 12秒
W 面,Led---->false: 22秒
E 面,Led---->false: 2秒
s add one
n add one
S 面,Led---------->true: 1秒
N _ remove a car , 待過的還有 : 0
N 面,Led---->false: 11秒
W 面,Led---->false: 21秒
E 面,Led---->false: 1秒
S 面,Led---------->true: 0秒
N 面,Led---->false: 10秒
W 面,Led---->false: 20秒
E 面,Led---->false: 0秒
RED等切換為:E 面,只允許 W 面 開車
s add one
S 面,Led---->false: 29秒
N 面,Led---->false: 9秒
W 面,Led---->false: 19秒
E 面, Led---------->true: 9秒
W _ remove a car , 待過的還有 : 0
S 面,Led---->false: 28秒
W 面,Led---->false: 18秒
N 面,Led---->false: 8秒
E 面, Led---------->true: 8秒
s add one
S 面,Led---->false: 27秒
N 面,Led---->false: 7秒
W 面,Led---->false: 17秒
E 面, Led---------->true: 7秒
S 面,Led---->false: 26秒
N 面,Led---->false: 6秒
W 面,Led---->false: 16秒
E 面, Led---------->true: 6秒
w add one
n add one
S 面,Led---->false: 25秒
N 面,Led---->false: 5秒
W 面,Led---->false: 15秒
E 面, Led---------->true: 5秒
W _ remove a car , 待過的還有 : 0
e add one
S 面,Led---->false: 24秒
N 面,Led---->false: 4秒
W 面,Led---->false: 14秒
E 面, Led---------->true: 4秒
e add one
S 面,Led---->false: 23秒
N 面,Led---->false: 3秒
W 面,Led---->false: 13秒
E 面, Led---------->true: 3秒
n add one
S 面,Led---->false: 22秒
N 面,Led---->false: 2秒
W 面,Led---->false: 12秒
E 面, Led---------->true: 2秒
n add one
S 面,Led---->false: 21秒
W 面,Led---->false: 11秒
N 面,Led---->false: 1秒
E 面, Led---------->true: 1秒
s add one
S 面,Led---->false: 20秒
N 面,Led---->false: 0秒
RED等切換為:N 面,只允許 S 面 開車
W 面,Led---->false: 10秒
E 面, Led---------->true: 0秒
S 面,Led---->false: 19秒
W 面,Led---->false: 9秒
N 面, Led---------->true: 9秒
S _ remove a car , 待過的還有 : 4
E 面,Led---->false: 29秒
S 面,Led---->false: 18秒
N 面, Led---------->true: 8秒
S _ remove a car , 待過的還有 : 3
W 面,Led---->false: 8秒
E 面,Led---->false: 28秒
w add one
S 面,Led---->false: 17秒
W 面,Led---->false: 7秒
N 面, Led---------->true: 7秒
S _ remove a car , 待過的還有 : 2
E 面,Led---->false: 27秒
S 面,Led---->false: 16秒
W 面,Led---->false: 6秒
N 面, Led---------->true: 6秒
S _ remove a car , 待過的還有 : 1
E 面,Led---->false: 26秒
n add one
e add one
S 面,Led---->false: 15秒
W 面,Led---->false: 5秒
N 面, Led---------->true: 5秒
S _ remove a car , 待過的還有 : 0
E 面,Led---->false: 25秒
S 面,Led---->false: 14秒
N 面, Led---------->true: 4秒
W 面,Led---->false: 4秒
E 面,Led---->false: 24秒
e add one
s add one
S 面,Led---->false: 13秒
N 面, Led---------->true: 3秒
S _ remove a car , 待過的還有 : 0
W 面,Led---->false: 3秒
E 面,Led---->false: 23秒
S 面,Led---->false: 12秒
N 面, Led---------->true: 2秒
W 面,Led---->false: 2秒
E 面,Led---->false: 22秒
S 面,Led---->false: 11秒
N 面, Led---------->true: 1秒
W 面,Led---->false: 1秒
E 面,Led---->false: 21秒
w add one
S 面,Led---->false: 10秒
N 面, Led---------->true: 0秒
W 面,Led---->false: 0秒
RED等切換為:W 面,只允許 E 面開車
E 面,Led---->false: 20秒
S 面,Led---->false: 9秒
N 面,Led---->false: 29秒
W 面,Led---------->true: 9秒
E _ remove a car , 待過的還有 : 4
E 面,Led---->false: 19秒
尊敬的老師:由於我沒有根據張老師的那個要求做,還請抽點時間幫我一下。((*^__^*) 嘻嘻,雖然有點囉嗦,麻煩老師了)