国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

java多線程模擬交通燈管理系統(tǒng)

瀏覽:2日期:2023-12-05 15:51:08

本文實(shí)例為大家分享了java多線程模擬交通燈管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

一、項(xiàng)目業(yè)務(wù)邏輯分析

項(xiàng)目需求:模擬實(shí)現(xiàn)十字路口的交通燈管理系統(tǒng)邏輯,要求如下:

異步隨機(jī)生成按照各個(gè)路線行駛的車輛,例如由北向南行駛的車輛、由東向南行駛的車輛。 信號燈忽略黃燈,只考慮紅燈和綠燈的情況。 左轉(zhuǎn)受信號燈控制,右轉(zhuǎn)車輛不受信號燈控制,其他情況與現(xiàn)實(shí)生活的邏輯相同。 注:南北向車輛和東西向方向車輛交替放行,同方向等待車輛應(yīng)先放行直行車輛,而后再放行左轉(zhuǎn)車輛。 每輛車通過路口所需時(shí)間為1秒(提示:可以通過線程的sleep方法模擬)。 隨機(jī)生成車輛,時(shí)間間隔以及紅綠燈交換時(shí)間自定。 不要求GUI,只考慮系統(tǒng)邏輯實(shí)現(xiàn)。可在在終端log方式模擬。

首先了解一下現(xiàn)實(shí)中十字路口的交通燈的業(yè)務(wù)邏輯(為此我大晚上在十字路口仔細(xì)觀察了半個(gè)小時(shí),缺少生活啊。),直接上圖吧,直觀明了:

java多線程模擬交通燈管理系統(tǒng)

額,乍一看有點(diǎn)亂,仔細(xì)一想很簡單,就是東西南北四條路每條路都有三個(gè)去向,左轉(zhuǎn)、右轉(zhuǎn)和直行,這樣一個(gè)十字路口就有了12個(gè)行駛方向。每個(gè)方向都有一個(gè)指示燈,也就是12個(gè)信號燈,如果每個(gè)信號燈都單獨(dú)控制,那就麻煩多了,而且很不科學(xué),得一天24小時(shí)堵車。需求第3點(diǎn)說明右轉(zhuǎn)不受信號燈控制,其實(shí)現(xiàn)實(shí)生活照也是這樣,一般右轉(zhuǎn)車輛不受控制的(比較繁忙的路口受控制),隨時(shí)可以轉(zhuǎn),也就是說永遠(yuǎn)是綠色等,想不通為什么這樣設(shè)計(jì)?而 對立面的燈是同步變化的,同時(shí)綠或者同時(shí)紅,這樣只需要系統(tǒng)控制一個(gè)方向的燈就可以了。最后我們只需要控制四個(gè)方向的燈就行了,這里選擇了圖中標(biāo)記的①②④③四條路線,只要在改變其中一條路線的信號燈時(shí)同步改變對立面的燈為相同信號就行了。另外還要同時(shí)把下一個(gè)信號燈切換成相反的信號,例如S2W變紅時(shí),同時(shí)N2E也要變紅,并且E2W或W2E變綠。這里我們選擇逆時(shí)針方向輪循。

二、系統(tǒng)詳細(xì)設(shè)計(jì)

根據(jù)業(yè)務(wù)需求分析,需要對象:信號燈、信號燈控制系統(tǒng)、汽車和路線。下面具體分析每個(gè)對象所以屬性和方法。信號燈類(Lamp):信號燈只有紅和綠兩種狀態(tài),用boolean變量表示,true表示綠燈,false表示紅燈。還要提供切換信號燈狀態(tài)的方法turnRed和turnGreen。信號燈控制系統(tǒng)(LampController):控制系統(tǒng)主要負(fù)責(zé)在規(guī)定時(shí)間切換紅綠燈,并隨著此類的創(chuàng)建,整個(gè)系統(tǒng)就開始運(yùn)作,所以把系統(tǒng)啟動(dòng)的實(shí)現(xiàn)放在了構(gòu)造方法內(nèi)。汽車(Vihicles):這里只需要體現(xiàn)汽車穿過路口的過程不需要體現(xiàn)移動(dòng)細(xì)節(jié),也就是捕捉路上減少一輛車的過程,所以,這個(gè)車并不需要單獨(dú)設(shè)計(jì)成為一個(gè)對象,用一個(gè)字符串表示就可以了。并且車是屬于公路的,應(yīng)該是一種聚合關(guān)系,根據(jù)擁有數(shù)據(jù)者應(yīng)提供訪問數(shù)據(jù)的方法的規(guī)律,這里路要提供增減車輛的方法。路線(Road):每輛汽車不是看到對面的信號燈變綠就可以穿過的,要按照路線上的車隊(duì)順序依次通過路口,這個(gè)深有體會,堵車有時(shí)兩次綠燈都過不去路口。

根據(jù)以上分析類圖設(shè)計(jì)如下:

java多線程模擬交通燈管理系統(tǒng)

類圖很簡單,可以看出這三個(gè)類之間只是簡單的關(guān)聯(lián), Road中要用到Lamp的信號燈狀態(tài)判斷是否放行車輛,LampController負(fù)責(zé)定時(shí)切換Lamp的信號燈狀態(tài)。具體實(shí)現(xiàn)時(shí)為了方便有些方法的功能是放在構(gòu)造方法里實(shí)現(xiàn)的。

三、具體實(shí)現(xiàn)

Lamp類:

public enum Lamp { /** * E2W=East to West, N2S=North to South * 從南面的交通燈開始,逆時(shí)針執(zhí)行 */ //初始狀態(tài)為紅燈 S2N('N2S','S2W',false),S2W('N2E','E2W',false), E2W('W2E','E2S',false),E2S('W2N','S2N',false), //對立面紅燈 N2E(null,null,false),N2S(null,null,false), W2E(null,null,false),W2N(null,null,false), //四個(gè)右轉(zhuǎn)方向,始終時(shí)綠燈 S2E(null,null,true),E2N(null,null,true), N2W(null,null,true),W2S(null,null,true); //燈的狀態(tài) true=green,false=red private boolean lighted; private String opposite=null; private String next=null; private Lamp() {} /** * @param opposite 對面的燈 * @param nexe 下一個(gè)燈 * @param initLighted 燈的初始狀態(tài) */ private Lamp(String opposite,String next,boolean initLighted){ this.opposite=opposite; this.next=next; this.lighted=initLighted; } //判斷燈的狀態(tài) public boolean getLighted(){ return lighted; } //綠燈亮 同時(shí)把對面的燈設(shè)為綠 下一個(gè)燈設(shè)為紅燈 public void turnGreen(){ this.lighted=true; //如果對面有燈 if(opposite!=null){ Lamp.valueOf(opposite).turnGreen(); } } //紅燈亮 對立面的燈也變紅 public Lamp turnRed(){ this.lighted=false; Lamp nextGreenLamp=null; //對面的燈 同步變化 if(opposite!=null){ Lamp.valueOf(opposite).turnRed(); } //下一個(gè)燈 綠燈亮 if(next!=null){ nextGreenLamp=Lamp.valueOf(next); nextGreenLamp.turnRed(); } return nextGreenLamp; }}

Road類:

public class Road { //存放每條路上的車輛 車名就表示一輛車 private List<String> vehicles=new ArrayList<String>(); private String roadName=null; public Road(String roadName) { super(); //根據(jù)路的方向取名,名字和對面的紅綠燈同名 E2W表示東向西的路 this.roadName = roadName; //用線程池啟動(dòng)一個(gè)線程,隨機(jī)產(chǎn)生一輛車 Executors.newSingleThreadExecutor().execute(new Runnable(){ @Override public void run() { for(int i=1;i<1000;i++){ try { //每隔1~10秒 隨機(jī)產(chǎn)生一輛車 Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { e.printStackTrace(); } //訪問外部類的成員變量 vehicles.add(Road.this.roadName+'路 第 '+i+' 輛車'); } } }); /* * 定義一個(gè)計(jì)時(shí)器 使這條路每隔1s 就檢查一次這條路對應(yīng)的交通燈的狀態(tài) * 如果是綠燈 就每隔1s使離一輛車 */ ScheduledExecutorService timer=Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable(){ @Override public void run() { //先判斷這條路上是否有車 if(vehicles.size()>0){ //在判斷交通燈狀態(tài)boolean lighted=Lamp.valueOf(Road.this.roadName).getLighted(); if(lighted){ //從汽車列表中移除 并提示已通過路口 System.out.println(vehicles.remove(0)+'通過路口。。。'); } } } }, 1, 1, TimeUnit.SECONDS); }}

LampController類:

//燈控系統(tǒng)public class LampController { private Lamp currentLamp; public LampController() { super(); //交通燈系統(tǒng)初始化 第一個(gè)運(yùn)行的S2N turn green this.currentLamp = Lamp.S2N; this.currentLamp.turnGreen(); //定時(shí)器 每個(gè)10s 切換一次信號燈狀態(tài) ScheduledExecutorService timer=Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable(){ @Override public void run() { currentLamp=currentLamp.turnRed(); } }, 10, 10, TimeUnit.SECONDS); }}

運(yùn)行結(jié)果:

java多線程模擬交通燈管理系統(tǒng)

四、總結(jié)

本題目整體結(jié)構(gòu)很簡單,不涉及復(fù)雜的設(shè)計(jì)模式,重點(diǎn)是對業(yè)務(wù)邏輯的分析,首先要搞明白交通信號燈的運(yùn)行機(jī)制,如果不考慮右轉(zhuǎn)的情況,簡答理解就是東西方向和南北方向的車輛交替放行,同方向等待紅燈的車輛先放行直行車輛一段時(shí)間,然后再放行左轉(zhuǎn)的車輛。在具體實(shí)現(xiàn)上有兩個(gè)難點(diǎn):其一就是利用線程設(shè)置定時(shí)器,實(shí)時(shí)監(jiān)控每條路上的信號燈狀態(tài)和模擬隨機(jī)在各個(gè)方向的路上產(chǎn)生一些車輛,控制系統(tǒng)的任務(wù)比較簡單只需要定時(shí)輪流切換信號燈狀態(tài)。其二是巧妙的把四個(gè)方向的信號燈設(shè)計(jì)成了一個(gè)環(huán)形鏈表,控制系統(tǒng)只需要控制一個(gè)信號燈,其他3個(gè)就有規(guī)律的聯(lián)動(dòng)運(yùn)行了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产高清在线看 | 亚洲系列中文字幕一区二区 | 久久久久欧美精品 | 一本久久道久久爱 | 欧美做a一级视频免费观看 欧美做爱毛片 | 欧美色视频日本片高清在线观看 | 日韩一级片在线免费观看 | 亚洲精品一区二区三区在线观看 | 欧美成人精品在线 | 国产一区二区三区免费观看 | 久久99精品视频在线在线观看 | 免费无毒| 国产极品喷水视频jk制服 | 欧美日韩国产成人精品 | 国产一区二区在线视频播放 | 成人区精品一区二区不卡亚洲 | 国产精品亚洲精品日韩已满 | 国产女人在线视频 | 99在线精品免费视频九九视 | 最新福利片v国产片 | 91亚洲精品一区二区福利 | 亚洲在线精品 | 性做久久久久免费看 | 中文字幕 日韩在线 | 午夜欧美精品久久久久久久久 | 亚洲国产欧美目韩成人综合 | yy6080福利午夜免费观看 | 亚洲三级在线观看 | 欧美区一区 | 成年人看的黄色片 | 国产成人永久免费视频 | 久久久久欧美精品 | 亚洲三级理论 | 亚洲美女网址 | 日韩性片 | 最新国产三级在线不卡视频 | 午夜在线播放免费人成无 | 欧美第一精品 | 久久国产精品无码网站 | 国产日韩欧美精品一区二区三区 | 青青操在线视频 |