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