您的位置:首页 > 其它

一个电梯运行的模拟实现

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 ↑,

。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: