Java實現程序排程演算法(二) RR(時間片輪轉)
阿新 • • 發佈:2018-12-21
RR類(主類)
只有calc()中涉及了演算法,init()和printResult()都只有簡單的輸入輸出操作。
1 package xqy.algorithm;
2
3 import java.util.*;
4
5 import xqy.Util.Tools;
6 import xqy.been.Process;
7
8 /**
9 * @author xqy
10 * @date 2018年12月19日19:14:49
11 */
12 public class RR {
13 private int processNumber; 14 private ArrayList<Process> processList; 15 private int timeSlice; 16 17 public RR() { 18 init(); 19 calc(); 20 Tools.printResult(processList); 21 } 22 23 private void init() { 24 Scanner sc = new Scanner(System.in); 25 26 System.out.print("<RR> Please enter the slice time:"); 27 timeSlice = sc.nextInt(); 28 System.out.print("<RR> please enter the process num:"); 29 processNumber = sc.nextInt(); 30 31 processList = new ArrayList<Process>(); 32 for (int i = 0; i < processNumber; i++) { 33 processList.add(new Process()); 34 } 35 36 System.out.println("<RR> Please enter each process arrival time:"); 37 for (int i = 0; i < processNumber; i++) { 38 System.out.print(" Process" + (i + 1) + ":"); 39 processList.get(i).setArrivalTime(sc.nextInt()); 40 } 41 42 System.out.println("<RR> Please enter each process service time:"); 43 for (int i = 0; i < processNumber; i++) { 44 System.out.print(" Process" + (i + 1) + ":"); 45 int servicesTime = sc.nextInt(); 46 System.out.println(); 47 48 processList.get(i).setServicesTime(servicesTime); 49 processList.get(i).setRemainServiceTime(servicesTime); 50 } 51 } 52 53 private void calc() { 54 int timeNow = 0; 55 int processRemain = processNumber; 56 Process opProcess; 57 58 while (processRemain != 0) { 59 for (int i = 0; i < processNumber; i++) { 60 opProcess = processList.get(i); 61 62 if (opProcess.getRemainServiceTime() > 0) { 63 // First time 64 if (opProcess.getServicesTime() == opProcess.getRemainServiceTime()) { 65 int waitTime = timeNow - opProcess.getArrivalTime(); 66 67 opProcess.setStartTime(timeNow); 68 opProcess.setWaitTime(waitTime); 69 } 70 71 // Calculating remain service time 72 int remainServiceTime = opProcess.getRemainServiceTime() - timeSlice; 73 opProcess.setRemainServiceTime(remainServiceTime); 74 75 // Last time 76 if (remainServiceTime <= 0) { 77 int completionTime = timeNow + timeSlice; // 程序是執行完當前時間片才結束的 78 int turnAroundTime = completionTime 79 - opProcess.getArrivalTime(); 80 double turnAroundTimeWithWeight = 1.0 * turnAroundTime 81 / opProcess.getServicesTime(); 82 83 opProcess.setCompletionTime(completionTime); 84 opProcess.setTurnAroundTime(turnAroundTime); 85 opProcess.setTurnAroundTimeWithWeight( 86 turnAroundTimeWithWeight); 87 88 processRemain--; 89 } 90 91 System.out.println(" #STEP#Process" + (i + 1) + " remain service time:" + opProcess.getRemainServiceTime() + ((remainServiceTime <= 0)?" Finish":"")); 92 timeNow += timeSlice; 93 } else { 94 // do noting, because this process has been completed. 95 } 96 97 } 98 } 99 } 100 101 public static void main(String [] args) { 102 new RR(); 103 } 104 }
Process類
模擬了程序,對屬性進行了封裝。
1 package xqy.been; 2 3 public class Process { 4 private int arrivalTime; 5 private int servicesTime; 6 private int remainServiceTime; 7 private int startTime; 8 private int waitTime; 9 private int completionTime; 10 11 /** 12 * turnAroundTime = completionTime - arrivalTime 13 */ 14 private int turnAroundTime; 15 16 /** 17 * turnAroundTimeWithWeight = turnAroundTime / servicesTime 18 */ 19 private double turnAroundTimeWithWeight; 20 21 public Process() { 22 ; 23 } 24 25 public int getArrivalTime() { 26 return arrivalTime; 27 } 28 29 public void setArrivalTime(int arrivalTime) { 30 this.arrivalTime = arrivalTime; 31 } 32 33 public int getServicesTime() { 34 return servicesTime; 35 } 36 37 public void setServicesTime(int servicesTime) { 38 this.servicesTime = servicesTime; 39 } 40 41 public int getRemainServiceTime() { 42 return remainServiceTime; 43 } 44 45 public void setRemainServiceTime(int remainServiceTime) { 46 this.remainServiceTime = remainServiceTime; 47 } 48 49 public int getStartTime() { 50 return startTime; 51 } 52 53 public void setStartTime(int startTime) { 54 this.startTime = startTime; 55 } 56 57 public int getWaitTime() { 58 return waitTime; 59 } 60 61 public void setWaitTime(int waitTime) { 62 this.waitTime = waitTime; 63 } 64 65 public int getCompletionTime() { 66 return completionTime; 67 } 68 69 public void setCompletionTime(int completionTime) { 70 this.completionTime = completionTime; 71 } 72 73 public int getTurnAroundTime() { 74 return turnAroundTime; 75 } 76 77 public void setTurnAroundTime(int turnAroundTime) { 78 this.turnAroundTime = turnAroundTime; 79 } 80 81 public double getTurnAroundTimeWithWeight() { 82 return turnAroundTimeWithWeight; 83 } 84 85 public void setTurnAroundTimeWithWeight(double turnAroundTimeWithWeight) { 86 this.turnAroundTimeWithWeight = turnAroundTimeWithWeight; 87 } 88 89 @Override 90 public String toString() { 91 return "Process [arrivalTime=" + arrivalTime + ", servicesTime=" 92 + servicesTime + ", remainServiceTime=" + remainServiceTime 93 + ", startTime=" + startTime + ", waitTime=" + waitTime 94 + ", completionTime=" + completionTime + ", turnAroundTime=" 95 + turnAroundTime + ", turnAroundTimeWithWeight=" 96 + turnAroundTimeWithWeight + "]"; 97 } 98 }
Tools類
因為我這次作業要實現幾個類似的演算法,所以我把每個演算法中都要用到的方法都提取出來作為單獨的工具類。
也可以將這些工具方法都放入FCFS類中。
1 package xqy.Util; 2 3 import java.util.ArrayList; 4 5 import xqy.been.Process; 6 7 public class Tools { 8 9 public static double calcAverageTurnAroundTime( 10 ArrayList<Process> processList) { 11 double sum = 0; 12 for (int i = 0; i < processList.size(); i++) { 13 sum += processList.get(i).getTurnAroundTime(); 14 } 15 return Math.round(sum / processList.size() * 100) / 100.0; 16 } 17 18 public static double calcAverageTurnAroundTimeWithWeight( 19 ArrayList<Process> processList) { 20 double sum = 0; 21 for (int i = 0; i < processList.size(); i++) { 22 sum += processList.get(i).getTurnAroundTimeWithWeight(); 23 } 24 return Math.round(sum / processList.size() * 100) / 100.0; 25 } 26 27 public static void printResult(ArrayList<Process> processList) { 28 System.out.println("\n #RESULT#"); 29 30 System.out.print("\tArrive:\t\t"); 31 for (int i = 0; i < processList.size(); i++) { 32 System.out.print(processList.get(i).getArrivalTime() + "\t"); 33 } 34 System.out.println(); 35 36 System.out.print("\tService:\t"); 37 for (int i = 0; i < processList.size(); i++) { 38 System.out.print(processList.get(i).getServicesTime() + "\t"); 39 } 40 System.out.println(); 41 42 System.out.print("\tStart:\t\t"); 43 for (int i = 0; i < processList.size(); i++) { 44 System.out.print(processList.get(i).getStartTime() + "\t"); 45 } 46 System.out.println(); 47 48 System.out.print("\tWait:\t\t"); 49 for (int i = 0; i < processList.size(); i++) { 50 System.out.print(processList.get(i).getWaitTime() + "\t"); 51 } 52 System.out.println(); 53 54 System.out.print("\tFinish:\t\t"); 55 for (int i = 0; i < processList.size(); i++) { 56 System.out.print(processList.get(i).getCompletionTime() + "\t"); 57 } 58 System.out.println(); 59 60 System.out.print("\tTurn around:\t"); 61 for (int i = 0; i < processList.size(); i++) { 62 System.out.print(processList.get(i).getTurnAroundTime() + "\t"); 63 } 64 System.out.println(); 65 66 System.out.print("\tTA wight:\t"); 67 for (int i = 0; i < processList.size(); i++) { 68 System.out.print(Math.round(processList.get(i) 69 .getTurnAroundTimeWithWeight() * 100) / 100.0 + "\t"); 70 } 71 System.out.println(); 72 73 System.out.println("\tAverage turn around time:" 74 + Tools.calcAverageTurnAroundTime(processList) + "\t"); 75 System.out.println("\tAverage turn around time with wight:" 76 + Tools.calcAverageTurnAroundTimeWithWeight(processList)); 77 78 System.out.println(); 79 } 80 }