# 基于Android实现的电梯调度模拟
# 一、使用说明
## 1.1 项目简介
某一楼有20层,操作者可以通过使用5部电梯从起始楼层来到达指定的楼层。本项目通过实现电梯调度,来模拟实现操作系统的调度过程,并且学习Android环境下使用Java的多线程编程方法以及调度算法。
##1.2 项目要求
- 操作者可以在1~20层任意一层进入电梯并到达指定楼层
- 电梯中有一些按键供操作者使用,开门键(缩短开门时间)、关门键(缩短关门时间)、上行键、下行键(前往上层或下层)
- 每部电梯外部和内部有一个数码器用于显示当前电梯当前所在楼层
- 5部电梯相互联结,即当一个电梯按钮按下去时,其它电梯相应按钮同时点亮,表示也按下去了。所有电梯初始状态都在第一层,且每个电梯没有相应请求情况下,在原地保持不动。在电梯到达起始楼层或终点楼层时,会自动进入电梯内部,进入电梯内部后可以在电梯内部等待到达终点楼层,也可以退回到外部界面进行下次操作
- 电梯运行时每层楼需要1秒,开门或关门时需要5秒
## 1.3 操作手册
运行程序后,首先进入操作界面,即电梯外部。如图,共有5部电梯,且每部电梯有数码显示器和上下行按键。由于界面大小的限制,将电梯数字按键改为手动输入起始点和终点,位于5部电梯下方。以下只演示一部电梯的使用情况,其余电梯使用情况相同,只需根据调度算法去选择不同电梯来执行相应任务。
### 1.3.1 情况一:1至15层
![](http://www.writebug.com/myres/static/uploads/2021/10/19/696c03fc222b6d5ddb7a85a1a8bc3f9a.writebug)
**第一步**,输入起始点和终点。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/bbd69818b30f6f720e61760fd47f7b57.writebug)
**第二步**,点击任一上行按键可启动电梯,目前电梯状态都在初始楼层1楼且都处于静止状态,该情况下默认第一部电梯启动。当电梯到达起始点楼层时,会自动进入电梯内部。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/12da0d4e333ed00ff01e465db22df99f.writebug)
**第三步**,电梯内部的数码显示器会显示当前楼层。其中刚进入电梯时会有5秒延迟,该时间用于乘客进入电梯,可以提前点击左下方关门按钮让电梯立即启动。由于界面大小问题,无法在保证美观的前提下完全装下20个按键,因此该电梯只需在电梯外输入起始点和终点。
左上角的返回按钮可以让视角返回上一层界面观察电梯调度情况。
| 界面1 | 界面2 |
| :---------------: | :---------------: |
| ![](http://www.writebug.com/myres/static/uploads/2021/10/19/ff26190d1f3a1bd7fe39fd17ea5abca7.writebug) | ![](http://www.writebug.com/myres/static/uploads/2021/10/19/f38a22000e7b58b7c061111571b923f8.writebug) |
**第四步**,当电梯到达指定楼层后,会有5秒延迟来打开电梯门,此时点击开门按键会立刻开门离开电梯,返回电梯操作界面。可以看到此时第一部电梯已到达15层。可以在该界面继续进行其他操作。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/d7c511b2dfc2120824dc3be434c3d6ea.writebug)
## 1.3.2 情况二:电梯从1层前往20层时,有乘客在10层按键希望到达18层
**第一步**:输入起始点和终点,点击向上按键,自动进入电梯界面,电梯开始自动向上前进。
| 界面1 | 界面2 |
| :---------------: | :---------------: |
| ![](http://www.writebug.com/myres/static/uploads/2021/10/19/338342f40e972be06ff06db436f8a66e.writebug) | ![](http://www.writebug.com/myres/static/uploads/2021/10/19/1adc5e41df19658d485da3a405710a08.writebug) |
**第二步**:点击左上角返回按键,返回上一层,输入另一乘客的请求楼层,起始点10层,终点18层。调度算法会调用同向的第一部电梯。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/773aa005128543d60f973abdce6cf5d5.writebug)
**第三步**:电梯到达10层后会自动进入电梯内部,直到到达18层后会离开电梯。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ed5be1fb959f4966baa4f400038f2614.writebug)
**第四步**:电梯在将中间乘客送到指定地点后,继续前往原终点20层。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/970f8b1460c5b2bd34ce1602c13ca09b.writebug)
## 1.4 注意事项
- 输入的起始点和终点必须是1~20的数字,且在按电梯按键时该输入框不可为空,若为空会有提示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/9e01fd1a0368e0fd1becaf4850182a18.writebug)
- 5部电梯会出现满负荷操作现象,即所有电梯都在运行,若此时操作过快会引起系统错误,此时会有提示禁止操作。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6f9a84642e1e20831b19dfc614d65b67.writebug)
- 在进入电梯内部后,只有在电梯停止过程中,即乘客刚进入电梯的过程和电梯刚到终点等待乘客离开电梯时,才可以使用开门与关门键,其他时间使用电梯不会做出任何反应。
- 电梯可以接受多个中间请求,但同一中间请求只会有一部电梯响应。如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的概念,即进程控制块,其中包含了电梯的一些状态以及一些电梯信息:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/e1c7c396613dd1b717ec385e42491408.writebug)
## 3.2 调度算法
由于可以直接得到乘客的起点和终点,电梯可以直接判断乘客的前进方向是向上还是向下。算
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
某一楼有20层,操作者可以通过使用5部电梯从起始楼层来到达指定的楼层。本项目通过实现电梯调度,来模拟实现操作系统的调度过程,并且学习Android环境下使用Java的多线程编程方法以及调度算法。 ##1.2 项目要求 操作者可以在1~20层任意一层进入电梯并到达指定楼层 电梯中有一些按键供操作者使用,开门键(缩短开门时间)、关门键(缩短关门时间)、上行键、下行键(前往上层或下层) 每部电梯外部和内部有一个数码器用于显示当前电梯当前所在楼层 5部电梯相互联结,即当一个电梯按钮按下去时,其它电梯相应按钮同时点亮,表示也按下去了。所有电梯初始状态都在第一层,且每个电梯没有相应请求情况下,在原地保持不动。在电梯到达起始楼层或终点楼层时,会自动进入电梯内部,进入电梯内部后可以在电梯内部等待到达终点楼层,也可以退回到外部界面进行下次操作 电梯运行时每层楼需要1秒,开门或关门时需要5秒
资源推荐
资源详情
资源评论
收起资源包目录
基于Android实现的电梯调度模拟.rar (63个子文件)
基于Android实现的电梯调度模拟
elevator_dispatching_code
src
开发文档.doc 955KB
演示视频.mp4 2.76MB
Elavator
elavator_inner.jpg 301KB
gradle.properties 855B
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 230B
down.png 1KB
app
src
androidTest
java
com
example
elavator
ApplicationTest.java 351B
test
java
com
example
elavator
ExampleUnitTest.java 313B
main
java
com
example
elavator
TextCircleView.java 3KB
DeletableEditText.java 4KB
Elavator.java 7KB
MainActivity.java 6KB
Inner_elavator.java 3KB
res
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-mdpi
Thumbs.db 5KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
values-w820dp
dimens.xml 358B
values
dimens.xml 211B
strings.xml 303B
styles.xml 193B
layout
activity_main.xml 10KB
inner_elavator.xml 2KB
drawable
elavator_inner.jpg 301KB
down.png 1KB
Thumbs.db 19KB
open.jpg 3KB
add.png 1KB
back.png 6KB
elavator_close.png 2KB
up.png 1KB
cancle.jpg 1KB
close.png 2KB
AndroidManifest.xml 804B
proguard-rules.pro 645B
build.gradle 621B
.gitignore 7B
gradlew.bat 2KB
build.gradle 498B
.idea
.name 8B
runConfigurations.xml 564B
vcs.xml 164B
misc.xml 2KB
inspectionProfiles
Project_Default.xml 268B
profiles_settings.xml 235B
compiler.xml 686B
modules.xml 353B
gradle.xml 679B
encodings.xml 159B
copyright
profiles_settings.xml 74B
settings.gradle 15B
open.jpg 3KB
gradlew 5KB
back.png 6KB
elavator_close.png 2KB
up.png 1KB
close.png 2KB
.gitignore 97B
LICENSE 1KB
README.md 13KB
共 63 条
- 1
资源评论
甜辣uu
- 粉丝: 8601
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功