⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elevator.java

📁 这是我们专业的课程设计
💻 JAVA
字号:
package Control;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import Data.StateData;

public class Elevator implements Runnable {

	private boolean[] floorToStop = new boolean[11];
	
	public boolean needOpen = false;//用于同层要求的标记值---刘畅

	public int nextStop = 0;// 下一站
	private int topStop = 1;// 需停留的最高楼层
	private int bottomStop = 10;// 需停留的最低楼层
	private boolean endTurn = false;// 是否在此方向的终点回头
	public boolean running = false;
	public int direction = 0;
	public int number;

	public boolean immediateOpen = false;
	public boolean immediateClose = false;

	public boolean stop = false;

	//public static boolean outerTaskSet[][] = new boolean[10][2];

	//静态数据
	public static int numberOfRunningElevators = 0;
	
	public static OuterTaskQueue outerTaskQueue = new OuterTaskQueue();
	public static StateData data = new StateData();
	
	public static double gateOpeningTime = 1;
	public static double gateOpenTime = 3;
	public static double timePerFloor = 1;
	
	public static int oneSecond = 1000;
	public static File record = new File("Record.txt");
	public static FileWriter recordWriter;
	
	public static void writeRecord(String str){

		try {
			recordWriter = new FileWriter(record,true);
			recordWriter.append(str);
			recordWriter.close();
		} catch (IOException e1) {
			// TODO 自动生成 catch 块
			e1.printStackTrace();
		}
	}

	public void closeGate() {
		writeRecord("The door of elevator " + number + "closed\n");
		data.elevator[number].direction = -2;
		int op = (int) (data.elevator[number].openedPercent * 100);		
		for (int i = op;data.elevator[number].openedPercent > 0 && !immediateOpen; i--) {
			try {
				Thread.sleep((int) (gateOpeningTime * oneSecond / 100));
			} catch (Exception e) {
			}
			data.elevator[number].openedPercent -= 0.01;
		}
		if(immediateOpen){
			immediateOpen = false;
			openGate();
			if(!immediateClose){
				try {
					
					Thread.sleep((int) (gateOpenTime * oneSecond));
				} catch (Exception e) {
				}
			}
			immediateClose = false;
			closeGate();
		}
		data.elevator[number].direction = direction;
	}

	public void openGate() {
		writeRecord("The door of elevator " + number + "opened\n");
		data.elevator[number].direction = 2;
		int op = (int) (data.elevator[number].openedPercent * 100);
		for (int i = op; data.elevator[number].openedPercent < 1; i++) {
			try {
				Thread.sleep((int) (gateOpeningTime * oneSecond / 100));
			} catch (Exception e) {
			}
			data.elevator[number].openedPercent += 0.01;
		}
	}

	public void findNextStop() {
		if (direction > 0) {
			for (int i = data.elevator[number].floor; i <= 10; i++) {
				if (floorToStop[i]){
					nextStop = i;
					break;	
				}
			}
		} else if(direction < 0){
			for (int i = data.elevator[number].floor; i >= 1; i--) {
				if (floorToStop[i]){
					nextStop = i;
					break;	
				}
			}
		} 
	}

	public void addStop(int stopFloor) {
		floorToStop[stopFloor] = true;
		if (direction == 0){
			if (stopFloor > data.elevator[number].floor)
				direction = 1;
			if (stopFloor < data.elevator[number].floor)
				direction = -1;
		}
		if ((stopFloor - data.elevator[number].floor) * direction < 0)
			endTurn = true;
		if (stopFloor > topStop)
			topStop = stopFloor;
		if (stopFloor < bottomStop)
			bottomStop = stopFloor;
	}

	private void getOuterTask() {
		if (outerTaskQueue.number > 0){
			OuterTask task = outerTaskQueue.dequeue();
			addStop(task.floor);
			if ((task.floor - data.elevator[number].floor) * task.direction < 0)
				endTurn = true;
		}

	}

	public void run() {
		while (running) {
			try {			
				Thread.sleep((int) (timePerFloor * oneSecond));
			} catch (Exception e) {
			}
			data.elevator[number].direction = direction;
			
			//判断是否因为同层请求而要开门
			if(needOpen) {
				needOpen = false;
				openGate();
				if(!immediateClose){
					try {
						
						Thread.sleep((int) (gateOpenTime * oneSecond));
					} catch (Exception e) {
					}
				}
				closeGate();
			}
			
			if (stop || direction == 0){
				if(immediateOpen){
					immediateOpen = false;
					openGate();
					if(!immediateClose){
						try {
							
							Thread.sleep((int) (gateOpenTime * oneSecond));
						} catch (Exception e) {
						}
					}
					immediateClose = false;
					closeGate();
				}
				continue;	
			}

			if (nextStop != 0) // 当前有任务
			{
				if (data.elevator[number].floor == nextStop) {
					floorToStop[data.elevator[number].floor] = false;
					findNextStop();
					data.elevator[number].light[data.elevator[number].floor] = 0;
					if (direction >= 0)
						data.floor.upLight[data.elevator[number].floor] = 0;
					if (direction <= 0)
						data.floor.downLight[data.elevator[number].floor] = 0;
					if (direction == 0){
						bottomStop = 10;
						topStop = 1;
					}
					
					if (data.elevator[number].floor == bottomStop
							&& data.elevator[number].direction == -1) {
						bottomStop = 10;
						if (endTurn) {
							direction = 1;
							findNextStop();
							endTurn = false;
						} else {
							nextStop = 0;
							direction = 0;
						}
					} else if (data.elevator[number].floor == topStop
							&& direction == 1) {
						topStop = 1;
						if (endTurn) {
							direction = -1;
							findNextStop();
							endTurn = false;
						} else {
							nextStop = 0;
							direction = 0;
						}
					} else if(data.elevator[number].floor == topStop || data.elevator[number].floor == bottomStop){
						nextStop = 0;
						direction = 0;
					}

					data.elevator[number].direction = direction;				
					openGate();				
					if(!immediateClose){
						try {
							
							Thread.sleep((int) (gateOpenTime * oneSecond));
						} catch (Exception e) {
						}
					}
					immediateClose = false;
					closeGate();
					if(immediateOpen){
						immediateOpen = false;
						openGate();
						if(!immediateClose){
							try {
								
								Thread.sleep((int) (gateOpenTime * oneSecond));
							} catch (Exception e) {
							}
						}
						closeGate();
					}
					data.elevator[number].direction = direction;	
				}
				findNextStop();
				data.elevator[number].direction = direction;
				if(data.elevator[number].floor == 10 && data.elevator[number].direction == 1){
					data.elevator[number].direction = 0;
					direction = 0;
				}
				if(data.elevator[number].floor == 1 && data.elevator[number].direction == -1){
					data.elevator[number].direction = 0;
					direction = 0;
				}	
				if(data.elevator[number].direction != 2 && data.elevator[number].direction != -2){
					data.elevator[number].floor += direction;
				}
				writeRecord("Elevator " + number + " moved to floor " +data.elevator[number].floor +"\n");
				
			} else {
				getOuterTask();
				findNextStop();
			}
			
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -