首页 > 其他 > 详细

一个电梯运行的模拟实现

时间:2015-10-21 02:05:51      阅读:305      评论:0      收藏:0      [点我收藏+]

用Java写了一个类似电梯模拟器的一段代码,运行了下,还没有发现大问题,记录如下:

基本思路:

模拟电梯运行(为单一电梯,未考虑达到承载上限,最短等待时间等问题)

基本条件:

1、电梯有三种状态:静止,向上,向下。

2、每层的指示灯有三种状态:向上、向下、到达(只开门)。

3、开门上人1秒,每上或下一层用0.1秒。

?

实现方案:

使用一个队列(可看做时间优先)将所有按钮事件依次入队。

当电梯静止时首先响应队头的按钮事件,并根据按钮楼层和当前楼层的位置确定移动方向; 当向上移动时,将移动到所有亮灯的按钮所在楼层的最高层,当按钮方向和电梯方向一致时或该楼层内部到达按钮亮起时开门;向下移动类似。 当队列中没有按钮事件时,电梯静止。有些类似LOOK算数,但没有按钮事件时不会来回扫描。

使用主线程来控制电梯上下,需要注意同步“设置和获取电梯按钮最高层或按钮最底层数的方法”。

?

主方法用来不断循环监测:

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);
		}

?电梯上升方法:

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线程,模拟用户按下按钮

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();
				}
			}
		}
	}

?

还定义了一个EleStat线程,监测电梯状态并打印的后台,日志类似:

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

?

?具体代码见附件。

一个电梯运行的模拟实现

原文:http://yunnick.iteye.com/blog/2250343

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!