用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