You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改抢占式优先级调度代码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:35:22