如何修改抢占式优先级调度代码的Burst Time输出?
解决Burst Time显示为0的问题
问题根源
你的代码中,computeWaitingTime方法处理完进程后执行了burstTime[minIndex] = 0,用原始burst时间数组标记进程完成状态,这直接覆盖了用户输入的原始数据,导致最终显示时Burst Time列全为0。
修改方案
新增一个数组专门记录剩余执行时间,保留原始burstTime数组的输入值,具体修改如下:
- 添加静态数组
remainingBurstTime,用于跟踪进程剩余执行时间 - 在程序初始化阶段,将原始
burstTime的值复制到remainingBurstTime中 - 修改
computeWaitingTime里的判断与操作逻辑,基于remainingBurstTime处理,不再修改原始burstTime - 修正
computeTurnAroundTime的计算逻辑,周转时间为等待时间加原始burst时间
修改后的完整代码
import java.util.Scanner; public class PreemptivePriorityScheduling { static int[] processId, arrivalTime, burstTime, priority, waitingTime, turnAroundTime; // 新增数组:记录剩余执行时间,保留原始burstTime不变 static int[] remainingBurstTime; static int n; public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter the number of processes: "); n = input.nextInt(); processId = new int[n]; arrivalTime = new int[n]; burstTime = new int[n]; priority = new int[n]; waitingTime = new int[n]; turnAroundTime = new int[n]; // 初始化剩余执行时间数组 remainingBurstTime = new int[n]; getInput(input); // 将原始burstTime的值复制到剩余执行时间数组 for (int i = 0; i < n; i++) { remainingBurstTime[i] = burstTime[i]; } computeWaitingTime(); computeTurnAroundTime(); displayTable(); displayAverages(); } public static void getInput(Scanner input) { for (int i = 0; i < n; i++) { System.out.print("Enter process ID, arrival time, burst time, and priority for process " + (i + 1) + ": "); processId[i] = input.nextInt(); arrivalTime[i] = input.nextInt(); burstTime[i] = input.nextInt(); priority[i] = input.nextInt(); } } public static void computeWaitingTime() { int complete = 0, minPriority, minIndex = 0; for (int i = 0; i < n; i++) { minPriority = Integer.MAX_VALUE; for (int j = 0; j < n; j++) { // 判断条件改为基于剩余执行时间 if (arrivalTime[j] <= complete && priority[j] < minPriority && remainingBurstTime[j] > 0) { minPriority = priority[j]; minIndex = j; } } // 累加剩余执行时间到完成时间 complete += remainingBurstTime[minIndex]; waitingTime[minIndex] = complete - arrivalTime[minIndex] - burstTime[minIndex]; // 将剩余执行时间设为0,标记进程完成,不改动原始burstTime remainingBurstTime[minIndex] = 0; } } public static void computeTurnAroundTime() { for (int i = 0; i < n; i++) { // 周转时间 = 等待时间 + 原始burst时间 turnAroundTime[i] = waitingTime[i] + burstTime[i]; } } public static void displayTable() { System.out.println("Process ID\tArrival Time\tBurst Time\tPriority\tWaiting Time\tTurn Around Time"); for (int i = 0; i < n; i++) { // 显示原始的burstTime值 System.out.println(processId[i] + "\t\t" + arrivalTime[i] + "\t\t" + burstTime[i] + "\t\t" + priority[i] + "\t\t" + waitingTime[i] + "\t\t" + turnAroundTime[i]); } } public static void displayAverages() { int totalWaitingTime = 0, totalTurnAroundTime = 0; for (int i = 0; i < n; i++) { totalWaitingTime += waitingTime[i]; totalTurnAroundTime += turnAroundTime[i]; } System.out.println("\nAverage Waiting Time: " + (float)totalWaitingTime / n); System.out.println("Average Turn Around Time: " + (float)totalTurnAroundTime / n); } }
内容的提问来源于stack exchange,提问作者Toonas
相关产品推荐
相关产品推荐

