一个电梯运行的模拟实现
2015-10-23 14:04
281 查看
一个电梯运行的模拟实现
用Java写了一个类似电梯模拟器的一段代码,运行了下,还没有发现大问题,记录如下:基本思路:
模拟电梯运行(为单一电梯,未考虑达到承载上限,最短等待时间等问题)
基本条件:
1、电梯有三种状态:静止,向上,向下。
2、每层的指示灯有三种状态:向上、向下、到达(只开门)。
3、开门上人1秒,每上或下一层用0.1秒。
伦理片 http://www.dotdy.com/
实现方案: 使用一个队列(可看做时间优先)将所有按钮事件依次入队。
当电梯静止时首先响应队头的按钮事件,并根据按钮楼层和当前楼层的位置确定移动方向; 当向上移动时,将移动到所有亮灯的按钮所在楼层的最高层,当按钮方向和电梯方向一致时或该楼层内部到达按钮亮起时开门;向下移动类似。 当队列中没有按钮事件时,电梯静止。有些类似LOOK算数,但没有按钮事件时不会来回扫描。
使用主线程来控制电梯上下,需要注意同步“设置和获取电梯按钮最高层或按钮最底层数的方法”。
主方法用来不断循环监测:
Java代码
while(true){
if(!ele.getPushedFloor().isEmpty()){
int nextFloor = ele.getPushedFloor().peek();
if(nextFloor > 0){//向上的按钮
if(ele.getCurFloor() - nextFloor <= 0){
ele.liftUp();
}else if(ele.getCurFloor() - nextFloor > 0){
ele.liftDown();
}
}else{//向下的按钮
if(ele.getCurFloor() + nextFloor < 0){
ele.liftUp();
}else if(ele.getCurFloor() + nextFloor >= 0){
ele.liftDown();
}
}
}else{
ele.setStat(RunningStat.INIT);
}
Thread.sleep(100);
}
电梯上升方法:
Java代码
public void liftUp() throws InterruptedException{
setStat(RunningStat.UP);
int floorIdx = curFloor;
while(floorIdx <= this.getLiftTop()){
curFloor = floorIdx;
if(btnMap.get(floorIdx).isUpLightOn()){
openDoor(floorIdx, true);
btnMap.get(floorIdx).setUpLightOn(false);
}else if(btnMap.get(floorIdx).isInnerLightOn()){
justOpenDoor(floorIdx);
}
/**
* 模拟电梯上升
*/
Thread.sleep(100);
floorIdx++;
}
synchronized (this) {
//需要注意,若“当前层”达到最高层需重新初始化最高层指示变量
if(this.getLiftTop() == curFloor){
this.setLiftTop(bottom - 1);
}
}
}
定义了一个User线程,模拟用户按下按钮
Java代码
class User implements Runnable{
@Override
public void run() {
int i = 0;
while(i < 10){
i++;
int floor = RandomUtils.nextInt(top) + 1;
Button btn = ele.getButton(floor);
try {
if(floor == ele.top){
btn.push(floor, BtnDirec.DOWN);
}else if(floor % 2 == 0 || floor == ele.bottom){
btn.push(floor, BtnDirec.UP);
}else{
btn.push(floor, BtnDirec.DOWN);
}
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
影音先锋电影 http://www.iskdy.com/
还定义了一个EleStat线程,监测电梯状态并打印的后台,日志类似:
Java代码
The elevator started
The elevator is no moving, cur:1
5 floor down light on
5 ↓,
The elevator is lift up, cur:1
5 ↓,
The elevator is lift up, cur:2
5 ↓,
The elevator is lift up, cur:3
5 ↓,
The elevator is lift up, cur:4
5 ↓,
The elevator is lift up, cur:5
10 floor up light on
5 ↓,10 ↑,
The elevator is lift up, cur:6
5 ↓,10 ↑,
The elevator is lift up, cur:7
5 ↓,10 ↑,
The elevator is lift up, cur:8
5 ↓,10 ↑,
The elevator is lift up, cur:9
opening door on floor: 10 lift to:20
5 ↓,20 -,
The elevator is lift up, cur:10
12 floor up light on
5 ↓,20 -,12 ↑,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,
The elevator is lift up, cur:10
13 floor down light on
5 ↓,20 -,12 ↑,13 ↓,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,13 ↓,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,13 ↓,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,13 ↓,
The elevator is lift up, cur:10
5 ↓,20 -,12 ↑,13 ↓,
The elevator is lift up, cur:10
14 floor up light on
5 ↓,20 -,12 ↑,13 ↓,14 ↑,
The elevator is lift up, cur:11
opening door on floor: 12 lift to:20
5 ↓,20 -,13 ↓,14 ↑,
。。。
相关文章推荐
- 基于struts2的前端分页
- 多附件上传---上传的后台
- mongodb和spring集成中MongoTemplate的总结是使用方法
- swift:Optional Type 、Swift和Objective-C混编的讲解
- flex 鼠标事件和效果
- 如何恢复win8系统硬盘丢失数据
- 今年,或许是自己一个新的开始,拥抱改变,成就人生~
- LOF基金接口 交易型开放式指数基金接口分享
- This request has been blocked; the content must be served over HTTPS.
- 从创建webservice到发布webservice的一些相关总结
- css3中的伪元素
- UIView的Touch事件UIControlEvents详解
- DLL项目报错:fatal error lnk1104: cannot open file "...\xxx.dll"
- postgresql 检查点优化
- Linux下添加任务计划,计划内容以sh文件表示
- 选购移动电源几个认识误区
- Android Developper 学习
- Leetcode Problem2 two numbers
- linux备份文件夹
- PrepareStatement防止数据库注入