电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java多線程模擬交通燈管理系統

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

本文實例為大家分享了java多線程模擬交通燈管理系統的具體代碼,供大家參考,具體內容如下

一、項目業務邏輯分析

項目需求:模擬實現十字路口的交通燈管理系統邏輯,要求如下:

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

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

java多線程模擬交通燈管理系統

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

二、系統詳細設計

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

根據以上分析類圖設計如下:

java多線程模擬交通燈管理系統

類圖很簡單,可以看出這三個類之間只是簡單的關聯, Road中要用到Lamp的信號燈狀態判斷是否放行車輛,LampController負責定時切換Lamp的信號燈狀態。具體實現時為了方便有些方法的功能是放在構造方法里實現的。

三、具體實現

Lamp類:

public enum Lamp { /** * E2W=East to West, N2S=North to South * 從南面的交通燈開始,逆時針執行 */ //初始狀態為紅燈 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), //四個右轉方向,始終時綠燈 S2E(null,null,true),E2N(null,null,true), N2W(null,null,true),W2S(null,null,true); //燈的狀態 true=green,false=red private boolean lighted; private String opposite=null; private String next=null; private Lamp() {} /** * @param opposite 對面的燈 * @param nexe 下一個燈 * @param initLighted 燈的初始狀態 */ private Lamp(String opposite,String next,boolean initLighted){ this.opposite=opposite; this.next=next; this.lighted=initLighted; } //判斷燈的狀態 public boolean getLighted(){ return lighted; } //綠燈亮 同時把對面的燈設為綠 下一個燈設為紅燈 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(); } //下一個燈 綠燈亮 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(); //根據路的方向取名,名字和對面的紅綠燈同名 E2W表示東向西的路 this.roadName = roadName; //用線程池啟動一個線程,隨機產生一輛車 Executors.newSingleThreadExecutor().execute(new Runnable(){ @Override public void run() { for(int i=1;i<1000;i++){ try { //每隔1~10秒 隨機產生一輛車 Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { e.printStackTrace(); } //訪問外部類的成員變量 vehicles.add(Road.this.roadName+'路 第 '+i+' 輛車'); } } }); /* * 定義一個計時器 使這條路每隔1s 就檢查一次這條路對應的交通燈的狀態 * 如果是綠燈 就每隔1s使離一輛車 */ ScheduledExecutorService timer=Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable(){ @Override public void run() { //先判斷這條路上是否有車 if(vehicles.size()>0){ //在判斷交通燈狀態boolean lighted=Lamp.valueOf(Road.this.roadName).getLighted(); if(lighted){ //從汽車列表中移除 并提示已通過路口 System.out.println(vehicles.remove(0)+'通過路口。。。'); } } } }, 1, 1, TimeUnit.SECONDS); }}

LampController類:

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

運行結果:

java多線程模擬交通燈管理系統

四、總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 釜溪印象网络 - Powered by Discuz! | 一点车讯-汽车网站,每天一点最新车讯! | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 电表箱-浙江迈峰电力设备有限公司-电表箱专业制造商 | 环氧树脂地坪漆_济宁市新天地漆业有限公司| 华溶溶出仪-Memmert稳定箱-上海协烁仪器科技有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 地磅-地秤-江阴/无锡地磅-江阴天亿计量设备有限公司_ | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 上海logo设计| 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 博医通医疗器械互联网供应链服务平台_博医通 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 临朐空调移机_空调维修「空调回收」临朐二手空调 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 |