HRRN RR Java 代码实现

本文档详细介绍了HRRNClass类的设计,包括构造方法和属性,以及HRRNDemo类中如何使用这些类进行进程调度,展示了RR算法的执行过程。重点涉及进程管理、周转时间和响应比计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 HRRNClass.java

public class HRRNClass {
    //    定义HRRN类
//    生成无参构造方法,带参构造方法
//    生成对应的get、Set方法
//    重写toString方法
    private String processId; //进程编号
    private int arrivalTime;//到达时间
    private int cpuBurst;//服务时间
    private int startTime;//开始时间
    private int finishTime;//结束时间
    private int turnaroundTime;//周转时间
    private double cTurnaroundTime;//带权周转时间
    private int waitingTime;//等待时间
    private double rate;

    //带全部参数的构造方法

    public HRRNClass(String processId, int arrivalTime, int cpuBurst, int startTime, int finishTime, int turnaroundTime, double cTurnaroundTime, int waitingTime) {
        this.processId = processId;
        this.arrivalTime = arrivalTime;
        this.cpuBurst = cpuBurst;
        this.startTime = startTime;
        this.finishTime = finishTime;
        this.turnaroundTime = turnaroundTime;
        this.cTurnaroundTime = cTurnaroundTime;
        this.waitingTime = waitingTime;

    }


    //    无参构造方法
    public HRRNClass() {
    }

    //   带三个参数的构造方法
    public HRRNClass(String processId, int arrivalTime, int cpuBurst) {
        this.processId = processId;
        this.arrivalTime = arrivalTime;
        this.cpuBurst = cpuBurst;
    }

    //    get、Set方法

    public String getProcessId() {
        return processId;
    }

    public void setProcessId(String processId) {
        this.processId = processId;
    }

    public int getArrivalTime() {
        return arrivalTime;
    }

    public void setArrivalTime(int arrivalTime) {
        this.arrivalTime = arrivalTime;
    }

    public int getCpuBurst() {
        return cpuBurst;
    }

    public void setCpuBurst(int cpuBurst) {
        this.cpuBurst = cpuBurst;
    }


    public int getStartTime() {
        return startTime;
    }

    public void setStartTime(int startTime) {
        this.startTime = startTime;
    }

    public int getFinishTime() {
        return finishTime;
    }

    public void setFinishTime(int finishTime) {
        this.finishTime = finishTime;
    }

    public int getTurnaroundTime() {
        return turnaroundTime;
    }

    public void setTurnaroundTime(int turnaroundTime) {
        this.turnaroundTime = turnaroundTime;
    }

    public double getcTurnaroundTime() {
        return cTurnaroundTime;
    }

    public void setcTurnaroundTime(double cTurnaroundTime) {
        this.cTurnaroundTime = cTurnaroundTime;
    }

    public int getWaitingTime() {
        return waitingTime;
    }

    public void setWaitingTime(int waitingTime) {
        this.waitingTime = waitingTime;
    }

    public double getRate() {
        return rate;
    }

    public void setRate(double rate) {
        this.rate = rate;
    }
//    重写toString方法


    @Override
    public String toString() {
        return "HRRNClass{" +
                "processId='" + processId + '\'' +
                ", arrivalTime=" + arrivalTime +
                ", cpuBurst=" + cpuBurst +
                ", startTime=" + startTime +
                ", finishTime=" + finishTime +
                ", turnaroundTime=" + turnaroundTime +
                ", cTurnaroundTime=" + cTurnaroundTime +
                ", waitingTime=" + waitingTime +
                '}';
    }
}

 HRRNDemo.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


public class HRRNDemo {
    //    定义测试类
    public static void main(String[] args) throws IOException {
//      Read data from the processInfo.txt and store it in the ArrayList collection
        BufferedReader br = new BufferedReader(new FileReader("HRRN\\src\\processInfo.txt"));

        String line;

        ArrayList<HRRNClass> processes = new ArrayList<>();
//       Reads a row of data, slices the data, initializes the object with a constructor with three parameters,
//       and stores the object into the ArrayList collection
        while ((line = br.readLine()) != null) {

            String[] data = line.split(",");//以逗号对数据进行切分
            String processId = data[0];
            int arrivalTime = Integer.parseInt(data[1]);//注意切分得到的每个数据对象是String类型,需转换成Int对应的包装类类型Integer类型

            int cpuBurst = Integer.parseInt(data[2]);//同上
            processes.add(new HRRNClass(processId, arrivalTime, cpuBurst));

        }
//        The enhanced for loop is used to traverse the ArrayList data and print the input data information
        System.out.println("输入信息:");
        for (HRRNClass process : processes) {
            System.out.println(process);
        }
//        Line breaks
        System.out.println("\n");

        //记录最先到达就绪队列进程
        int index = 0;
        for (int i = 1; i < processes.size(); i++) {
            if (processes.get(i).getArrivalTime() < processes.get(index).getArrivalTime()) {
                index = i;
            }
        }

        processes.get(index).setStartTime(0);
        processes.get(index).setFinishTime(processes.get(index).getStartTime() + processes.get(index).getCpuBurst());
        processes.get(index).setTurnaroundTime(processes.get(index).getFinishTime() - processes.get(index).getArrivalTime());
        processes.get(index).setcTurnaroundTime(processes.get(index).getTurnaroundTime() * 1.0 / processes.get(index).getCpuBurst());
        HRRNClass aClass = processes.get(index);
        int finishTime = processes.get(index).getFinishTime();
        System.out.println(aClass);
        processes.remove(index);


        while (true) {
            //计算就绪队列中各进程相应比
            for (int i = 0; i < processes.size(); i++) {
                HRRNClass hrrnClass = processes.get(i);
                hrrnClass.setRate((finishTime - hrrnClass.getArrivalTime() + hrrnClass.getCpuBurst()) * 1.0 / hrrnClass.getCpuBurst());
            }

            //调用工具类Collections工具类对就绪队列中各个进程按其相应比从高到低排序
            Collections.sort(processes, new Comparator<HRRNClass>() {
                @Override
                public int compare(HRRNClass o1, HRRNClass o2) {
                    return Double.compare(o2.getRate(), o1.getRate());
                }
            });

            //得到就绪队列中最高响应比的进程,分配处理机资源,优先调度
            HRRNClass hrrnClass = processes.get(0);
            processes.get(0).setStartTime(finishTime);
            processes.get(0).setFinishTime(processes.get(0).getStartTime() + processes.get(0).getCpuBurst());
            processes.get(0).setTurnaroundTime(processes.get(0).getFinishTime() - processes.get(0).getArrivalTime());
            processes.get(0).setcTurnaroundTime(processes.get(0).getTurnaroundTime() * 1.0 / processes.get(0).getCpuBurst());
            processes.get(0).setWaitingTime(processes.get(0).getStartTime() - processes.get(0).getArrivalTime());

            System.out.println(hrrnClass);
            //更改当前完成时间
            finishTime = processes.get(0).getFinishTime();
            processes.remove(0);

            if (processes.size() == 0) {
                break;
            }
        }

    }

}

processInfo.txt

p1,0,3
p3,2,1
p2,1,6
p4,3,5

 Process.java

//进程
class Process {
    private String name;
    private int arrivalTime; //到达时间
    private int cpuBurst; //服务时间
    private int remainServiceTime; //还需要服务的时间
    private int finishTime; //完成时间
    private int turnaroundTime; //周转时间
    private double cTurnaroundTime; //带权周转时间

    public int getRemainServiceTime() {
        return remainServiceTime;
    }

    public void setRemainServiceTime(int remainServiceTime) {
        this.remainServiceTime = remainServiceTime;
    }

    public Process(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getArrivalTime() {
        return arrivalTime;
    }

    public void setArrivalTime(int arrivalTime) {
        this.arrivalTime = arrivalTime;
    }

    public int getCpuBurst() {
        return cpuBurst;
    }

    public void setCpuBurst(int cpuBurst) {
        this.cpuBurst = cpuBurst;
    }

    public int getFinishTime() {
        return finishTime;
    }

    public void setFinishTime(int finishTime) {
        this.finishTime = finishTime;
    }

    public int getTurnaroundTime() {
        return turnaroundTime;
    }

    public void setTurnaroundTime(int turnaroundTime) {
        this.turnaroundTime = turnaroundTime;
    }

    public double getcTurnaroundTime() {
        return cTurnaroundTime;
    }

    public void setcTurnaroundTime(double cTurnaroundTime) {
        this.cTurnaroundTime = cTurnaroundTime;
    }
}

 RRDemo.java


import java.io.BufferedReader;
import java.io.FileReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;

public class RRDemo {
    private final int processCount; //进程数
    private final Queue<Process> readQueue; //就绪队列
    private final Queue<Process> unreachedQueue; //未到currTime队列
    private final int timeSlice; //时间片

    private final Queue<Process> executeQueue; //执行完毕的进程队列
    private double TotalWholeTime = 0.0;
    private double TotalWeightWholeTime = 0.0;

    private RRDemo(int processCount, Queue<Process> processQueue, int timeSlice) {
        this.processCount = processCount;
        this.unreachedQueue = processQueue;
        readQueue = new LinkedBlockingQueue<>();
        this.timeSlice = timeSlice;
        executeQueue = new LinkedList<>();
    }

    /**
     * RR 算法实现
     */
    public void RRAlgorithm() {
        readQueue.add(unreachedQueue.poll());
        Process currProcess = readQueue.poll();
        //第一个进程执行
        assert currProcess != null;
        int currTime = executeProcess(currProcess, 0);

        while (!readQueue.isEmpty() || !unreachedQueue.isEmpty()) {
            //把所有“到达时间”达到的进程加入运行队列头部
            while (!unreachedQueue.isEmpty()) {
                if (unreachedQueue.peek().getArrivalTime() <= currTime) {
                    readQueue.add(unreachedQueue.poll());
                } else {
                    break;
                }
            }

            if (currProcess.getRemainServiceTime() > 0) readQueue.add(currProcess);
            //运行队列不为空时
            if (!readQueue.isEmpty()) {
                currProcess = readQueue.poll();
                currTime = executeProcess(currProcess, currTime);
            } else {
                //当前没有进程执行,但还有进程为到达,时间直接跳转到到达时间
                currTime = unreachedQueue.peek().getArrivalTime();
            }
        }
    }

    private int executeProcess(Process currProcess, int currTime) {
        if (currProcess.getRemainServiceTime() - timeSlice <= 0) {
            //当前进程在这个时间片内能执行完毕
            showExecuteMessage(currTime, currTime += currProcess.getRemainServiceTime(), currProcess.getName());
            currProcess.setFinishTime(currTime);
            currProcess.setRemainServiceTime(0);
            //对周转时间等进行计算
            calculateWholeTime(currProcess);
            calculateWeightWholeTime(currProcess);
            TotalWholeTime += currProcess.getTurnaroundTime();
            TotalWeightWholeTime += currProcess.getcTurnaroundTime();
            executeQueue.add(currProcess);
        } else {
            //不能执行完毕
            showExecuteMessage(currTime, currTime += timeSlice, currProcess.getName());
            currProcess.setRemainServiceTime(currProcess.getRemainServiceTime() - timeSlice);
        }
        return currTime;
    }

    /**
     * 计算周转时间
     *
     */
    private void calculateWholeTime(Process process) {
        process.setTurnaroundTime(process.getFinishTime() - process.getArrivalTime());
    }

    /**
     * 计算带权周转时间
     *
     */
    private void calculateWeightWholeTime(Process process) {
        process.setcTurnaroundTime(process.getTurnaroundTime() / (double) process.getCpuBurst());
    }

    private void showExecuteMessage(int startTime, int endTime, String name) {
        System.out.println(startTime + "~" + endTime + ":【进程" + name + "】运行");
    }

    public void showResult() {
        System.out.print("进程名\t");
        System.out.print("周转时间\t");
        System.out.println("带权周转时间\t");
        Process process;
        while (!executeQueue.isEmpty()) {
            process = executeQueue.poll();
            System.out.print("进程" + process.getName() + "\t");
            System.out.print("\t" + process.getTurnaroundTime() + "\t");
            System.out.println("\t" + process.getcTurnaroundTime() + "\t");
        }
        System.out.println("平均周转时间:" + TotalWholeTime / (double) processCount);
        System.out.println("平均带权周转时间:" + TotalWeightWholeTime / (double) processCount);
    }

    public static void printAll(Queue<Process> queue) {
        System.out.print("进程名\t");
        System.out.print("到达时间\t");
        System.out.println("服务时间\t");
        Process process = null;
        while (!queue.isEmpty()) {
            process = queue.poll();
            System.out.print("进程" + process.getName() + "\t");
            System.out.print("\t" + process.getArrivalTime() + "\t");
            System.out.println("\t" + process.getCpuBurst() + "\t");
        }
    }

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        Queue<Process> queue = new LinkedBlockingQueue<>();
//      Read data from the processInfo.txt
        BufferedReader br = new BufferedReader(new FileReader("RR\\src\\processInfo.txt"));
        String line;
//       Reads a row of data, slices the data, initializes the object
        while ((line = br.readLine()) != null) {
            String[] data = line.split(",");//以逗号对数据进行切分
            String name = data[0];
            int arrivalTime = Integer.parseInt(data[1]);//注意切分得到的每个数据对象是String类型,需转换成Int对应的包装类类型Integer类型
            int cpuBurst = Integer.parseInt(data[2]);//同上
            Process process = new Process(name);
            process.setArrivalTime(arrivalTime);
            process.setCpuBurst(cpuBurst);
            process.setRemainServiceTime(cpuBurst);
            queue.add(process);
        }

        int processCount = queue.size();

        System.out.println("输入时间片大小");
        int timeSlice = sc.nextInt();

        RRDemo rr = new RRDemo(processCount, queue, timeSlice);

        System.err.println("*******************进程情况*****************");
        Thread.sleep(1000);
        printAll(new LinkedBlockingQueue<>(queue));
        Thread.sleep(1000);

        System.err.println("******************运行过程*****************");
        Thread.sleep(1000);
        rr.RRAlgorithm();
        Thread.sleep(1000);

        System.err.println("*******************运行结果*****************");
        Thread.sleep(1000);
        rr.showResult();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值