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