首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【轮转算法】

【轮转算法】

作者头像
贺公子之数据科学与艺术
发布2025-08-29 17:00:57
发布2025-08-29 17:00:57
7800
代码可运行
举报
运行总次数:0
代码可运行

以下是一个使用简单轮转法和优先数法的Java进程调度程序的示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Process {
    private int id;
    private int arrivalTime;
    private int burstTime;
    private int priority;
    private int waitingTime;
    private int turnaroundTime;

    public Process(int id, int arrivalTime, int burstTime, int priority) {
        this.id = id;
        this.arrivalTime = arrivalTime;
        this.burstTime = burstTime;
        this.priority = priority;
        this.waitingTime = 0;
        this.turnaroundTime = 0;
    }

    public int getId() {
        return id;
    }

    public int getArrivalTime() {
        return arrivalTime;
    }

    public int getBurstTime() {
        return burstTime;
    }

    public int getPriority() {
        return priority;
    }

    public int getWaitingTime() {
        return waitingTime;
    }

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

    public int getTurnaroundTime() {
        return turnaroundTime;
    }

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

public class ProcessScheduler {
    private Queue<Process> readyQueue;
    private List<Process> completedProcesses;

    public ProcessScheduler() {
        this.readyQueue = new LinkedList<>();
        this.completedProcesses = new ArrayList<>();
    }

    public void addProcess(Process process) {
        readyQueue.add(process);
    }

    public void runSimpleRoundRobin(int quantum) {
        Queue<Process> roundRobinQueue = new LinkedList<>(readyQueue);
        while (!roundRobinQueue.isEmpty()) {
            Process currentProcess = roundRobinQueue.poll();
            int remainingBurstTime = currentProcess.getBurstTime();
            while (remainingBurstTime > 0) {
                if (remainingBurstTime > quantum) {
                    remainingBurstTime -= quantum;
                    currentProcess.setBurstTime(remainingBurstTime);
                    roundRobinQueue.add(currentProcess);
                } else {
                    remainingBurstTime = 0;
                    currentProcess.setTurnaroundTime(currentProcess.getWaitingTime() + currentProcess.getBurstTime());
                    completedProcesses.add(currentProcess);
                }
            }
        }
    }

    public void runPriorityScheduling() {
        List<Process> sortedProcesses = new ArrayList<>(readyQueue);
        sortedProcesses.sort((p1, p2) -> p1.getPriority() - p2.getPriority());

        int currentTime = 0;
        for (Process process : sortedProcesses) {
            process.setWaitingTime(currentTime - process.getArrivalTime());
            process.setTurnaroundTime(process.getWaitingTime() + process.getBurstTime());
            completedProcesses.add(process);
            currentTime += process.getBurstTime();
        }
    }

    public void printProcessDetails() {
        int totalWaitingTime = 0;
        int totalTurnaroundTime = 0;
        System.out.println("Process\tArrival Time\tBurst Time\tPriority\tWaiting Time\tTurnaround Time");
        for (Process process : completedProcesses) {
            System.out.println(process.getId() + "\t\t" + process.getArrivalTime() + "\t\t\t" + process.getBurstTime()
                    + "\t\t\t" + process.getPriority() + "\t\t\t" + process.getWaitingTime() + "\t\t\t\t"
                    + process.getTurnaroundTime());
            totalWaitingTime += process.getWaitingTime();
            totalTurnaroundTime += process.getTurnaroundTime();
        }
        int avgWaitingTime = totalWaitingTime / completedProcesses.size();
        int avgTurnaroundTime = totalTurnaroundTime / completedProcesses.size();
        System.out.println("\nAverage Waiting Time: " + avgWaitingTime);
        System.out.println("Average Turnaround Time: " + avgTurnaroundTime);
    }

    public static void main(String[] args) {
        ProcessScheduler scheduler = new ProcessScheduler();

        // 添加进程到调度程序
        scheduler.addProcess(new Process(1, 0, 6, 2));
        scheduler.addProcess(new Process(2, 2, 4, 1));
        scheduler.addProcess(new Process(3, 4, 9, 3));
        scheduler.addProcess(new Process(4, 6, 2, 4));
        scheduler.addProcess(new Process(5, 8, 5, 2));

        // 运行简单轮转法,每个时间片的长度为2
        scheduler.runSimpleRoundRobin(2);
        scheduler.printProcessDetails();

        // 清空已完成的进程列表
        scheduler.completedProcesses.clear();

        // 运行优先数法
        scheduler.runPriorityScheduling();
        scheduler.printProcessDetails();
    }
}

此程序首先创建了一个Process类来表示进程,包含了进程的id、到达时间、执行时间和优先级等属性。然后创建了一个ProcessScheduler类来进行进程调度,其中使用了一个Queue来表示就绪队列,使用了一个List来存储已完成的进程。ProcessScheduler类提供了添加进程、使用简单轮转法和优先数法运行进程调度以及打印进程详情等方法。

main方法中,创建了一个ProcessScheduler对象,并添加了一些进程。然后使用简单轮转法运行进程调度,每个时间片的长度为2,并打印进程详情。接着清空已完成的进程列表,然后使用优先数法运行进程调度,并再次打印进程详情。

注意:以上示例程序仅为演示目的,并未经过详尽测试,可能存在一些问题。实际使用时需根据具体需求进行适当修改和完善。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以下是一个使用简单轮转法和优先数法的Java进程调度程序的示例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档