一个电梯运行的模拟实现


一个电梯运行的模拟实现

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

基本思路:

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

基本条件:

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

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

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

伦理片 http://www.dotdy.com/

实现方案:

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

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

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

 

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

Java代码   收藏代码
  1. while(true){  
  2.             if(!ele.getPushedFloor().isEmpty()){  
  3.                 int nextFloor = ele.getPushedFloor().peek();  
  4.                 if(nextFloor > 0){//向上的按钮  
  5.                     if(ele.getCurFloor() - nextFloor <= 0){  
  6.                         ele.liftUp();  
  7.                     }else if(ele.getCurFloor() - nextFloor > 0){  
  8.                         ele.liftDown();  
  9.                     }  
  10.                 }else{//向下的按钮  
  11.                     if(ele.getCurFloor() + nextFloor < 0){  
  12.                         ele.liftUp();  
  13.                     }else if(ele.getCurFloor() + nextFloor >= 0){  
  14.                         ele.liftDown();  
  15.                     }  
  16.                 }  
  17.             }else{  
  18.                 ele.setStat(RunningStat.INIT);  
  19.             }  
  20.             Thread.sleep(100);  
  21.         }  

 电梯上升方法:

Java代码   收藏代码
  1. public void liftUp() throws InterruptedException{  
  2.         setStat(RunningStat.UP);  
  3.         int floorIdx = curFloor;  
  4.         while(floorIdx <= this.getLiftTop()){  
  5.             curFloor = floorIdx;  
  6.             if(btnMap.get(floorIdx).isUpLightOn()){  
  7.                 openDoor(floorIdx, true);  
  8.                 btnMap.get(floorIdx).setUpLightOn(false);  
  9.             }else if(btnMap.get(floorIdx).isInnerLightOn()){  
  10.                 justOpenDoor(floorIdx);  
  11.             }  
  12.             /** 
  13.              * 模拟电梯上升 
  14.              */  
  15.             Thread.sleep(100);  
  16.             floorIdx++;  
  17.         }  
  18.         synchronized (this) {  
  19.             //需要注意,若“当前层”达到最高层需重新初始化最高层指示变量  
  20.             if(this.getLiftTop() == curFloor){  
  21.                 this.setLiftTop(bottom - 1);  
  22.             }  
  23.         }  
  24.     }  

 定义了一个User线程,模拟用户按下按钮

Java代码   收藏代码
  1. class User implements Runnable{  
  2.         @Override  
  3.         public void run() {  
  4.             int i = 0;  
  5.             while(i < 10){  
  6.                 i++;  
  7.                 int floor = RandomUtils.nextInt(top) + 1;  
  8.                 Button btn = ele.getButton(floor);  
  9.                 try {  
  10.                     if(floor == ele.top){  
  11.                         btn.push(floor, BtnDirec.DOWN);  
  12.                     }else if(floor % 2 == 0 || floor == ele.bottom){  
  13.                         btn.push(floor, BtnDirec.UP);  
  14.                     }else{  
  15.                         btn.push(floor, BtnDirec.DOWN);  
  16.                     }  
  17.                     Thread.sleep(500);  
  18.                 } catch (Exception e) {  
  19.                     e.printStackTrace();  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  

 影音先锋电影 http://www.iskdy.com/

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

Java代码   收藏代码
  1. The elevator started  
  2. The elevator is no moving, cur:1  
  3. 5 floor down light on  
  4. 5 ↓,  
  5. The elevator is lift up, cur:1  
  6. 5 ↓,  
  7. The elevator is lift up, cur:2  
  8. 5 ↓,  
  9. The elevator is lift up, cur:3  
  10. 5 ↓,  
  11. The elevator is lift up, cur:4  
  12. 5 ↓,  
  13. The elevator is lift up, cur:5  
  14. 10 floor up light on  
  15. 5 ↓,10 ↑,  
  16. The elevator is lift up, cur:6  
  17. 5 ↓,10 ↑,  
  18. The elevator is lift up, cur:7  
  19. 5 ↓,10 ↑,  
  20. The elevator is lift up, cur:8  
  21. 5 ↓,10 ↑,  
  22. The elevator is lift up, cur:9  
  23. opening door on floor: 10 lift to:20  
  24. 5 ↓,20 -,  
  25. The elevator is lift up, cur:10  
  26. 12 floor up light on  
  27. 5 ↓,20 -,12 ↑,  
  28. The elevator is lift up, cur:10  
  29. 5 ↓,20 -,12 ↑,  
  30. The elevator is lift up, cur:10  
  31. 5 ↓,20 -,12 ↑,  
  32. The elevator is lift up, cur:10  
  33. 5 ↓,20 -,12 ↑,  
  34. The elevator is lift up, cur:10  
  35. 5 ↓,20 -,12 ↑,  
  36. The elevator is lift up, cur:10  
  37. 13 floor down light on  
  38. 5 ↓,20 -,12 ↑,13 ↓,  
  39. The elevator is lift up, cur:10  
  40. 5 ↓,20 -,12 ↑,13 ↓,  
  41. The elevator is lift up, cur:10  
  42. 5 ↓,20 -,12 ↑,13 ↓,  
  43. The elevator is lift up, cur:10  
  44. 5 ↓,20 -,12 ↑,13 ↓,  
  45. The elevator is lift up, cur:10  
  46. 5 ↓,20 -,12 ↑,13 ↓,  
  47. The elevator is lift up, cur:10  
  48. 14 floor up light on  
  49. 5 ↓,20 -,12 ↑,13 ↓,14 ↑,  
  50. The elevator is lift up, cur:11  
  51. opening door on floor: 12 lift to:20  
  52. 5 ↓,20 -,13 ↓,14 ↑,  
  53. 。。。  

 

你可能感兴趣的:(一个电梯运行的模拟实现)