Java实现SJF算法的代码示例,数据自己从控制台输入
时间: 2024-03-27 09:36:43 浏览: 13
好的,下面是Java实现SJF算法的代码示例,可以自行从控制台输入数据:
```java
import java.util.*;
public class SJF {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入进程数:");
int n = sc.nextInt();
int[] pid = new int[n]; // 进程ID
int[] arriveTime = new int[n]; // 到达时间
int[] serviceTime = new int[n]; // 服务时间
int[] startTime = new int[n]; // 开始时间
int[] finishTime = new int[n]; // 完成时间
int[] turnaroundTime = new int[n]; // 周转时间
double[] weightTurnaroundTime = new double[n]; // 带权周转时间
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i + 1) + "个进程的信息(进程ID 到达时间 服务时间):");
pid[i] = sc.nextInt();
arriveTime[i] = sc.nextInt();
serviceTime[i] = sc.nextInt();
}
// 按照到达时间排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arriveTime[j] > arriveTime[j + 1]) {
int temp1 = pid[j];
pid[j] = pid[j + 1];
pid[j + 1] = temp1;
int temp2 = arriveTime[j];
arriveTime[j] = arriveTime[j + 1];
arriveTime[j + 1] = temp2;
int temp3 = serviceTime[j];
serviceTime[j] = serviceTime[j + 1];
serviceTime[j + 1] = temp3;
}
}
}
int[] finish = new int[n]; // 记录每个进程的完成时间
int currentTime = 0; // 当前时间
int index = 0; // 记录当前已经服务完的进程数
while (index < n) {
int minServiceTime = Integer.MAX_VALUE;
int minIndex = -1;
// 从尚未服务的进程中选择服务时间最短的
for (int i = 0; i < n; i++) {
if (finish[i] == 0 && serviceTime[i] < minServiceTime && arriveTime[i] <= currentTime) {
minServiceTime = serviceTime[i];
minIndex = i;
}
}
if (minIndex == -1) {
currentTime++;
} else {
startTime[minIndex] = currentTime;
finishTime[minIndex] = currentTime + serviceTime[minIndex];
finish[minIndex] = 1;
index++;
currentTime = finishTime[minIndex];
}
}
// 计算周转时间和带权周转时间
for (int i = 0; i < n; i++) {
turnaroundTime[i] = finishTime[i] - arriveTime[i];
weightTurnaroundTime[i] = (double) turnaroundTime[i] / serviceTime[i];
}
// 输出结果
System.out.println("进程ID\t到达时间\t服务时间\t开始时间\t完成时间\t周转时间\t带权周转时间");
for (int i = 0; i < n; i++) {
System.out.println(pid[i] + "\t\t" + arriveTime[i] + "\t\t" + serviceTime[i] + "\t\t" + startTime[i] + "\t\t" + finishTime[i] + "\t\t" + turnaroundTime[i] + "\t\t" + weightTurnaroundTime[i]);
}
}
}
```
注意:该代码实现的是非抢占式SJF算法,即一个进程一旦开始执行,就会一直执行到完成。如果需要实现抢占式SJF算法,需要对代码进行相应修改。