android电梯程序设计,课内资源 - 基于Android实现的电梯调度模拟
一、使用說(shuō)明
1.1 項(xiàng)目簡(jiǎn)介
某一樓有20層,操作者可以通過(guò)使用5部電梯從起始樓層來(lái)到達(dá)指定的樓層。本項(xiàng)目通過(guò)實(shí)現(xiàn)電梯調(diào)度,來(lái)模擬實(shí)現(xiàn)操作系統(tǒng)的調(diào)度過(guò)程,并且學(xué)習(xí)Android環(huán)境下使用Java的多線(xiàn)程編程方法以及調(diào)度算法。
1.2 項(xiàng)目要求操作者可以在1~20層任意一層進(jìn)入電梯并到達(dá)指定樓層
電梯中有一些按鍵供操作者使用,開(kāi)門(mén)鍵(縮短開(kāi)門(mén)時(shí)間)、關(guān)門(mén)鍵(縮短關(guān)門(mén)時(shí)間)、上行鍵、下行鍵(前往上層或下層)
每部電梯外部和內(nèi)部有一個(gè)數(shù)碼器用于顯示當(dāng)前電梯當(dāng)前所在樓層
5部電梯相互聯(lián)結(jié),即當(dāng)一個(gè)電梯按鈕按下去時(shí),其它電梯相應(yīng)按鈕同時(shí)點(diǎn)亮,表示也按下去了。所有電梯初始狀態(tài)都在第一層,且每個(gè)電梯沒(méi)有相應(yīng)請(qǐng)求情況下,在原地保持不動(dòng)。在電梯到達(dá)起始樓層或終點(diǎn)樓層時(shí),會(huì)自動(dòng)進(jìn)入電梯內(nèi)部,進(jìn)入電梯內(nèi)部后可以在電梯內(nèi)部等待到達(dá)終點(diǎn)樓層,也可以退回到外部界面進(jìn)行下次操作
電梯運(yùn)行時(shí)每層樓需要1秒,開(kāi)門(mén)或關(guān)門(mén)時(shí)需要5秒
1.3 操作手冊(cè)
運(yùn)行程序后,首先進(jìn)入操作界面,即電梯外部。如圖,共有5部電梯,且每部電梯有數(shù)碼顯示器和上下行按鍵。由于界面大小的限制,將電梯數(shù)字按鍵改為手動(dòng)輸入起始點(diǎn)和終點(diǎn),位于5部電梯下方。以下只演示一部電梯的使用情況,其余電梯使用情況相同,只需根據(jù)調(diào)度算法去選擇不同電梯來(lái)執(zhí)行相應(yīng)任務(wù)。
1.3.1 情況一:1至15層
第一步,輸入起始點(diǎn)和終點(diǎn)。
第二步,點(diǎn)擊任一上行按鍵可啟動(dòng)電梯,目前電梯狀態(tài)都在初始樓層1樓且都處于靜止?fàn)顟B(tài),該情況下默認(rèn)第一部電梯啟動(dòng)。當(dāng)電梯到達(dá)起始點(diǎn)樓層時(shí),會(huì)自動(dòng)進(jìn)入電梯內(nèi)部。
第三步,電梯內(nèi)部的數(shù)碼顯示器會(huì)顯示當(dāng)前樓層。其中剛進(jìn)入電梯時(shí)會(huì)有5秒延遲,該時(shí)間用于乘客進(jìn)入電梯,可以提前點(diǎn)擊左下方關(guān)門(mén)按鈕讓電梯立即啟動(dòng)。由于界面大小問(wèn)題,無(wú)法在保證美觀的前提下完全裝下20個(gè)按鍵,因此該電梯只需在電梯外輸入起始點(diǎn)和終點(diǎn)。
左上角的返回按鈕可以讓視角返回上一層界面觀察電梯調(diào)度情況。
界面1
界面2
第四步,當(dāng)電梯到達(dá)指定樓層后,會(huì)有5秒延遲來(lái)打開(kāi)電梯門(mén),此時(shí)點(diǎn)擊開(kāi)門(mén)按鍵會(huì)立刻開(kāi)門(mén)離開(kāi)電梯,返回電梯操作界面。可以看到此時(shí)第一部電梯已到達(dá)15層。可以在該界面繼續(xù)進(jìn)行其他操作。
1.3.2 情況二:電梯從1層前往20層時(shí),有乘客在10層按鍵希望到達(dá)18層
第一步:輸入起始點(diǎn)和終點(diǎn),點(diǎn)擊向上按鍵,自動(dòng)進(jìn)入電梯界面,電梯開(kāi)始自動(dòng)向上前進(jìn)。
界面1
界面2
第二步:點(diǎn)擊左上角返回按鍵,返回上一層,輸入另一乘客的請(qǐng)求樓層,起始點(diǎn)10層,終點(diǎn)18層。調(diào)度算法會(huì)調(diào)用同向的第一部電梯。
第三步:電梯到達(dá)10層后會(huì)自動(dòng)進(jìn)入電梯內(nèi)部,直到到達(dá)18層后會(huì)離開(kāi)電梯。
第四步:電梯在將中間乘客送到指定地點(diǎn)后,繼續(xù)前往原終點(diǎn)20層。
1.4 注意事項(xiàng)輸入的起始點(diǎn)和終點(diǎn)必須是1~20的數(shù)字,且在按電梯按鍵時(shí)該輸入框不可為空,若為空會(huì)有提示。
5部電梯會(huì)出現(xiàn)滿(mǎn)負(fù)荷操作現(xiàn)象,即所有電梯都在運(yùn)行,若此時(shí)操作過(guò)快會(huì)引起系統(tǒng)錯(cuò)誤,此時(shí)會(huì)有提示禁止操作。
在進(jìn)入電梯內(nèi)部后,只有在電梯停止過(guò)程中,即乘客剛進(jìn)入電梯的過(guò)程和電梯剛到終點(diǎn)等待乘客離開(kāi)電梯時(shí),才可以使用開(kāi)門(mén)與關(guān)門(mén)鍵,其他時(shí)間使用電梯不會(huì)做出任何反應(yīng)。
電梯可以接受多個(gè)中間請(qǐng)求,但同一中間請(qǐng)求只會(huì)有一部電梯響應(yīng)。如A電梯在從1層前往20層的過(guò)程中,如果中間有乘客請(qǐng)求從10層到18層,A電梯會(huì)響應(yīng)該請(qǐng)求,但如果在電梯到達(dá)10層前多次按電梯按鍵,其他電梯不會(huì)做出任何反應(yīng),只有A電梯會(huì)繼續(xù)前往10層。
二、概述
2.1 基本思路
該電梯調(diào)度項(xiàng)目所采取的電梯調(diào)度算法與操作系統(tǒng)中進(jìn)程調(diào)度算法中的搶占式SJF調(diào)度算法類(lèi)似,因?yàn)镾JF調(diào)度算法對(duì)于給定的一組進(jìn)程,平均等待時(shí)間最小,且搶占式SJF調(diào)度算法適用于電梯項(xiàng)目,在電梯上升或下降過(guò)程中,可能會(huì)出現(xiàn)同方向的樓層發(fā)出請(qǐng)求,搶占式SJF調(diào)度算法滿(mǎn)足該現(xiàn)象,可以使同方向的乘客共用一部電梯。因此采用此算法作為基本思路。
根據(jù)搶占式的SJF調(diào)度算法,本項(xiàng)目的調(diào)度算法的基本思想為三步:
同方向上有至少一個(gè)正在趕到乘客所在樓層的電梯,選擇距離最近的。根據(jù)搶占式SJF調(diào)度算法,如果后來(lái)請(qǐng)求的進(jìn)程所需的時(shí)間更短,則提前執(zhí)行該進(jìn)程,當(dāng)該進(jìn)程執(zhí)行完后,恢復(fù)原進(jìn)程。電梯調(diào)度同理,在某個(gè)電梯執(zhí)行某個(gè)請(qǐng)求時(shí),如果后來(lái)存在該電梯同向上的請(qǐng)求,且電梯正在前往目標(biāo)樓層時(shí),電梯會(huì)響應(yīng)該請(qǐng)求,并先將該乘客送往目的地后,繼續(xù)執(zhí)行原請(qǐng)求。項(xiàng)目中最重要的步驟為此步,嚴(yán)格按照搶占式SJF調(diào)度算法實(shí)現(xiàn),平均等待時(shí)間最小
若沒(méi)有同方向的電梯,調(diào)度距離最近的空閑電梯。這與搶占式SJF調(diào)度算法剛開(kāi)始的情況相同,并沒(méi)有進(jìn)程需要執(zhí)行,一旦有請(qǐng)求,立馬放入執(zhí)行過(guò)程中,無(wú)需等待
若既沒(méi)有同方向也沒(méi)有閑置的電梯,一直等待到有電梯閑置
2.2 主要文件MainActivity.class & activity_main.xml (主文件,即電梯外部操作界面)
Inner_elavator.class & inner_elavator.xml(電梯內(nèi)部文件)
TextCircleView.class(數(shù)碼顯示器控件)
Elavator.class(電梯類(lèi),相當(dāng)于進(jìn)程,既包含了相應(yīng)的電梯操作,也包含了操作系統(tǒng)中的PCB)
DeletableEditText.class(輸入框控件)
三、具體實(shí)現(xiàn)
3.1 PCB
在該項(xiàng)目中引用了操作系統(tǒng)中PCB的概念,即進(jìn)程控制塊,其中包含了電梯的一些狀態(tài)以及一些電梯信息:
3.2 調(diào)度算法
由于可以直接得到乘客的起點(diǎn)和終點(diǎn),電梯可以直接判斷乘客的前進(jìn)方向是向上還是向下。算法中的choice為將要調(diào)用的電梯的標(biāo)號(hào),初始為-1,distance數(shù)組為各電梯距離起點(diǎn)的距離。根據(jù)搶占式的SJF調(diào)度算法,本項(xiàng)目的調(diào)度算法的基本思想為三步:
1.同方向上有至少一個(gè)正在趕到乘客所在樓層的電梯,選擇距離最近的。
根據(jù)算法要求,首先遍歷五部電梯尋找同向電梯,若有同向,修改電梯距離至起始點(diǎn)的位置,默認(rèn)情況距離為100。在此之后,對(duì)數(shù)組distance進(jìn)行遍歷,尋找最短距離,若有同向電梯,將該電梯標(biāo)志賦給choice。若沒(méi)有則證明無(wú)同向電梯,進(jìn)行下一步判斷空閑電梯的距離。
2.若沒(méi)有同方向的電梯,調(diào)度距離最近的空閑電梯。
若無(wú)同方向電梯,經(jīng)過(guò)第一步后choice仍為-1,之后判斷各個(gè)電梯是否空閑,若空閑則修改其至起點(diǎn)距離,并尋找最短距離,將其電梯標(biāo)號(hào)賦給choice。
3.若既沒(méi)有同方向也沒(méi)有閑置的電梯,一直等待到有電梯閑置。此時(shí)choice仍為-1,只有在有電梯閑置的時(shí)候才可以接受請(qǐng)求。
3.3 電梯方向判斷
Elavator類(lèi)提供的Judge方法可以判斷電梯此時(shí)的方向,并且能夠?qū)⒊踔灯瘘c(diǎn)、終點(diǎn)、方向賦給當(dāng)前電梯。
3.4 電梯執(zhí)行當(dāng)前位置到起點(diǎn)的過(guò)程
Elavator類(lèi)提供的Pos_to_Start方法可以讓電梯在接受到指令后,從當(dāng)前位置前往目標(biāo)樓層的起始點(diǎn)。首先判斷當(dāng)前是否到達(dá)指定位置,根據(jù)方向不同對(duì)該電梯的位置count進(jìn)行修改,若到達(dá)指定位置,即到達(dá)起點(diǎn)時(shí),進(jìn)入電梯內(nèi)部,轉(zhuǎn)入活動(dòng)Inner_elavator,同時(shí)原操作界面在電梯停止五秒后,判斷此時(shí)乘客要求電梯向上還是向下,修改電梯方向值。
3.5 電梯調(diào)用
Elavator類(lèi)中的startTimer()方法讓系統(tǒng)可以調(diào)用該電梯。在電梯不是停止的條件下,向線(xiàn)程發(fā)送更新UI的消息,之后根據(jù)電梯狀態(tài),是否有被其他樓層請(qǐng)求,是否到達(dá)起點(diǎn)等情況調(diào)用不同的方法。
3.6 電梯接受其他樓層請(qǐng)求
Elavator類(lèi)中的Add()方法實(shí)現(xiàn)了其他樓層可以向同向電梯發(fā)出請(qǐng)求并得到接受。對(duì)正在調(diào)用的電梯的midEnd、midStart進(jìn)行判斷,判斷該電梯是否存在中間請(qǐng)求,若存在,電梯停止5秒,留給乘客上下行。
3.7 電梯從起點(diǎn)到終點(diǎn)
Elavator類(lèi)中的Start_to_End()方法實(shí)現(xiàn)了電梯從起點(diǎn)前往終點(diǎn)的過(guò)程。在未到達(dá)指定位置前,通過(guò)修改count來(lái)修改電梯當(dāng)前位置,若到達(dá)終點(diǎn)后,停止5秒留給乘客離開(kāi)電梯,同時(shí)判斷該電梯是否仍存在中間請(qǐng)求,即有人在該電梯前往終點(diǎn)的路上進(jìn)入了電梯,并選擇了其他樓層作為終點(diǎn),如存在則繼續(xù)前往下一個(gè)終點(diǎn)。
3.8 電梯內(nèi)部的實(shí)現(xiàn)
電梯內(nèi)部的實(shí)現(xiàn)也是依靠創(chuàng)建一個(gè)線(xiàn)程。在進(jìn)入電梯內(nèi)部時(shí),同時(shí)將起點(diǎn)、終點(diǎn)等信息傳入該活動(dòng)。
首先給1秒鐘的思考時(shí)間,乘客是否需要快速關(guān)門(mén),若關(guān)門(mén)則取消剩余的等待時(shí)間,直接開(kāi)始運(yùn)行。在電梯到達(dá)之前按下開(kāi)門(mén)鍵不會(huì)有任何反應(yīng),只有當(dāng)電梯到達(dá)之后,才會(huì)立即退出電梯。
四、總結(jié)
這次的項(xiàng)目主要是學(xué)習(xí)操作系統(tǒng)知識(shí)中的進(jìn)程調(diào)度算法,其中涉及的知識(shí)點(diǎn)包括進(jìn)程的創(chuàng)建和狀態(tài)切換、PCB以及進(jìn)程調(diào)度算法中的SJF調(diào)度算法。通過(guò)這次項(xiàng)目不僅是對(duì)操作系統(tǒng)中這一方面的知識(shí)點(diǎn)了解更深,對(duì)Android環(huán)境下的進(jìn)程創(chuàng)建和管理有了更多的了解。
由于創(chuàng)建的文件是APP,受制于屏幕的大小,沒(méi)有將20個(gè)數(shù)字鍵全部裝入屏幕,而是采取了更為簡(jiǎn)便的直接輸入。這與項(xiàng)目要求略有不符,沒(méi)有把20個(gè)電梯按鍵全裝入,因?yàn)槌鯇W(xué)Android,雖然能實(shí)現(xiàn)全部20個(gè)電梯按鍵在電梯內(nèi)部的功能,但是會(huì)出現(xiàn)大量的重復(fù)代碼(作為初學(xué)者的我認(rèn)為可能需要20個(gè)監(jiān)聽(tīng)?),而且UI做的很丑,希望助教能手下留情。
第一次使用Android和Java寫(xiě)有關(guān)進(jìn)程的算法,項(xiàng)目中可能還存在一些問(wèn)題,比如有時(shí)切換電梯內(nèi)外時(shí)略有延遲,會(huì)造成電梯內(nèi)外數(shù)據(jù)不同步的現(xiàn)象,而且電梯頻繁的內(nèi)外切換可能會(huì)影響觀察數(shù)據(jù),因?yàn)橐恍╅_(kāi)關(guān)門(mén)的時(shí)間問(wèn)題,很多時(shí)候會(huì)注意到關(guān)門(mén)出電梯的時(shí)候,該電梯已經(jīng)前往其他有需求的樓層,這一點(diǎn)由于不同操作者對(duì)電梯進(jìn)行操作是在內(nèi)部,而外部的進(jìn)程無(wú)法突然中斷,所以會(huì)造成內(nèi)外不同步的現(xiàn)象,但是這種現(xiàn)象算是比較少數(shù)的,比較多數(shù)的情況可能是因?yàn)檫M(jìn)程開(kāi)太多了,導(dǎo)致有時(shí)樓梯的數(shù)字時(shí)間是對(duì)的,但會(huì)一下走2個(gè)數(shù)字,即用2秒從1樓直接顯示3樓,這個(gè)問(wèn)題我不是很懂……所以沒(méi)能解決。
總結(jié)
以上是生活随笔為你收集整理的android电梯程序设计,课内资源 - 基于Android实现的电梯调度模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java学习笔记—生产者和消费者模式
- 下一篇: android 沉浸栏灰色,Androi