进程调度算法java实现
时间: 2023-11-18 20:06:35 浏览: 24
这里提供两种常见的进程调度算法的Java实现:先来先服务(FCFS)和最短作业优先(SJF)。
先来先服务(FCFS):
```java
import java.util.*;
public class FCFS {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入进程数:");
int n = sc.nextInt();
int[] arrivalTime = new int[n]; // 到达时间
int[] burstTime = new int[n]; // 执行时间
int[] waitingTime = new int[n]; // 等待时间
int[] turnaroundTime = new int[n]; // 周转时间
int totalWaitingTime = 0; // 总等待时间
int totalTurnaroundTime = 0; // 总周转时间
// 输入进程信息
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i+1) + "个进程的到达时间:");
arrivalTime[i] = sc.nextInt();
System.out.print("请输入第" + (i+1) + "个进程的执行时间:");
burstTime[i] = sc.nextInt();
}
// 计算等待时间和周转时间
int finishTime = 0; // 完成时间
for (int i = 0; i < n; i++) {
if (arrivalTime[i] > finishTime) {
finishTime = arrivalTime[i];
}
waitingTime[i] = finishTime - arrivalTime[i];
totalWaitingTime += waitingTime[i];
finishTime += burstTime[i];
turnaroundTime[i] = finishTime - arrivalTime[i];
totalTurnaroundTime += turnaroundTime[i];
}
// 输出结果
System.out.println("进程\t到达时间\t执行时间\t等待时间\t周转时间");
for (int i = 0; i < n; i++) {
System.out.println((i+1) + "\t" + arrivalTime[i] + "\t\t" + burstTime[i] + "\t\t" + waitingTime[i] + "\t\t" + turnaroundTime[i]);
}
System.out.println("平均等待时间:" + (double)totalWaitingTime/n);
System.out.println("平均周转时间:" + (double)totalTurnaroundTime/n);
}
}
```
最短作业优先(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[] arrivalTime = new int[n]; // 到达时间
int[] burstTime = new int[n]; // 执行时间
int[] waitingTime = new int[n]; // 等待时间
int[] turnaroundTime = new int[n]; // 周转时间
int totalWaitingTime = 0; // 总等待时间
int totalTurnaroundTime = 0; // 总周转时间
// 输入进程信息
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i+1) + "个进程的到达时间:");
arrivalTime[i] = sc.nextInt();
System.out.print("请输入第" + (i+1) + "个进程的执行时间:");
burstTime[i] = sc.nextInt();
}
// 按照到达时间排序
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (arrivalTime[i] > arrivalTime[j]) {
int temp = arrivalTime[i];
arrivalTime[i] = arrivalTime[j];
arrivalTime[j] = temp;
temp = burstTime[i];
burstTime[i] = burstTime[j];
burstTime[j] = temp;
}
}
}
// 计算等待时间和周转时间
boolean[] finished = new boolean[n]; // 记录进程是否完成
int currentTime = 0; // 当前时间
int count = 0; // 已完成的进程数
while (count < n) {
int minBurstTime = Integer.MAX_VALUE;
int minIndex = -1;
for (int i = 0; i < n; i++) {
if (!finished[i] && arrivalTime[i] <= currentTime && burstTime[i] < minBurstTime) {
minBurstTime = burstTime[i];
minIndex = i;
}
}
if (minIndex == -1) { // 没有进程可以执行,等待下一个进程到达
currentTime++;
continue;
}
waitingTime[minIndex] = currentTime - arrivalTime[minIndex];
totalWaitingTime += waitingTime[minIndex];
currentTime += burstTime[minIndex];
turnaroundTime[minIndex] = currentTime - arrivalTime[minIndex];
totalTurnaroundTime += turnaroundTime[minIndex];
finished[minIndex] = true;
count++;
}
// 输出结果
System.out.println("进程\t到达时间\t执行时间\t等待时间\t周转时间");
for (int i = 0; i < n; i++) {
System.out.println((i+1) + "\t" + arrivalTime[i] + "\t\t" + burstTime[i] + "\t\t" + waitingTime[i] + "\t\t" + turnaroundTime[i]);
}
System.out.println("平均等待时间:" + (double)totalWaitingTime/n);
System.out.println("平均周转时间:" + (double)totalTurnaroundTime/n);
}
}
```