public class FCFS { public static void main(String[] args) { Process head = null, tail = null; // 链表头和尾 head = tail = new Process("P1", 10, 0); tail.next = new Process("P2", 5, 1); tail = tail.next; tail.next = new Process("P3", 8, 2); tail = tail.next; tail.next = new Process("P4", 3, 3); tail = tail.next; int time = 0; // 当前时间 int finished = 0; // 已完成的进程数 double sumTurnaroundTime = 0; // 总周转时间 double sumWaitTime = 0; // 总等待时间 // 执行进程 while (finished < 4) { // 找到未执行的进程中到达时间最早的进程 Process p = null, prev = null, q = head; while (q != null) { if (q.state == 0 && (p == null || q.arriveTime < p.arriveTime)) { p = q; prev = prev == null ? head : prev.next; } q = q.next; } // 如果当前时间小于进程的到达时间,等待进程到达 if (time < p.arriveTime) { time = p.arriveTime; } // 执行进程 p.state = 1; time += p.runTime; p.state = 2; finished++; // 计算周转时间和等待时间 double turnaroundTime = time - p.arriveTime; sumTurnaroundTime += turnaroundTime; double waitTime = turnaroundTime - p.runTime; sumWaitTime += waitTime; // 从链表中删除已完成的进程 if (prev == null) { head = p.next; } else { prev.next = p.next; } } // 计算平均周转时间和平均等待时间 double avgTurnaroundTime = sumTurnaroundTime / 4; double avgWaitTime = sumWaitTime / 4; // 输出结果 System.out.println("进程名\t状态\t运行时间\t到达时间"); Process p = head; while (p != null) { System.out.println(p.name + "\t" + p.state + "\t" + p.runTime + "\t\t" + p.arriveTime); p = p.next; } System.out.println("平均周转时间:" + avgTurnaroundTime); System.out.println("平均等待时间:" + avgWaitTime); } }为什么结果只有进程1的状态
时间: 2024-04-06 13:35:12 浏览: 16
根据你提供的代码,我们可以看到在输出每个进程的状态时,只输出了进程名、状态、运行时间、到达时间四个字段,没有输出其他字段,比如进程的状态转换信息等。因此,在输出结果时只能看到每个进程的最终状态,而无法看到每个进程的状态转换过程。
另外,可能的原因是在程序执行过程中,其他进程的状态没有被正确更新,导致只有进程1的状态被正确输出。你可以加入调试信息,打印出每个进程在程序执行过程中的状态,以便更好地排查问题。
相关问题
import java.util.ArrayList; import java.util.List; public class FCFS { static class Process { String name; int status; int arriveTime; int runTime; public Process(String name, int status, int arriveTime, int runTime) { this.name = name; this.status = status; this.arriveTime = arriveTime; this.runTime = runTime; } } public static void main(String[] args){ List<Process> processes=new ArrayList<>(); processes.add(new Process("p1",0,0,3)); processes.add(new Process("p2",0,2,6)); processes.add(new Process("p3",0,4,4)); processes.add(new Process("p4",0,6,2)); processes.add(new Process("p5",0,8,5)); int currentTime=0; int finishCount=0; Process runningProcess=null; while(finishCount<processes.size()){ Process earliestProcess=null; for(Process process : processes){ if(process.status==0&&process.arriveTime<=currentTime){ if(earliestProcess==null||process.arriveTime<earliestProcess.arriveTime){ earliestProcess =process; } } } if(earliestProcess!=null){ earliestProcess.status=2; runningProcess=earliestProcess; System.out.println("时间"+currentTime+"运行进程"+runningProcess.name+",剩余时间"+runningProcess.runTime); } else if (runningProcess!=null) { runningProcess.runTime--; System.out.println("时间"+currentTime+"继续运行进程"+runningProcess.name+",剩余时间"+runningProcess.runTime); } if(runningProcess.runTime==0){ runningProcess.status=3; finishCount++; System.out.println("时间"+currentTime+"完成进程"+runningProcess.name); runningProcess=null; } currentTime++; } } }完善这段代码
这段代码实现了一个简单的先来先服务(FCFS)调度算法,但是缺少了输出进程执行顺序的功能。我们可以在程序结束后,输出每个进程的执行顺序,代码如下:
```java
import java.util.ArrayList;
import java.util.List;
public class FCFS {
static class Process {
String name;
int status;
int arriveTime;
int runTime;
public Process(String name, int status, int arriveTime, int runTime) {
this.name = name;
this.status = status;
this.arriveTime = arriveTime;
this.runTime = runTime;
}
}
public static void main(String[] args){
List<Process> processes=new ArrayList<>();
processes.add(new Process("p1",0,0,3));
processes.add(new Process("p2",0,2,6));
processes.add(new Process("p3",0,4,4));
processes.add(new Process("p4",0,6,2));
processes.add(new Process("p5",0,8,5));
int currentTime=0;
int finishCount=0;
Process runningProcess=null;
List<String> executedProcesses = new ArrayList<>(); // 用来记录进程的执行顺序
while(finishCount<processes.size()){
Process earliestProcess=null;
for(Process process : processes){
if(process.status==0&&process.arriveTime<=currentTime){
if(earliestProcess==null||process.arriveTime<earliestProcess.arriveTime){
earliestProcess =process;
}
}
}
if(earliestProcess!=null){
earliestProcess.status=2;
runningProcess=earliestProcess;
System.out.println("时间"+currentTime+"运行进程"+runningProcess.name+",剩余时间"+runningProcess.runTime);
}
else if (runningProcess!=null) {
runningProcess.runTime--;
System.out.println("时间"+currentTime+"继续运行进程"+runningProcess.name+",剩余时间"+runningProcess.runTime);
}
if(runningProcess.runTime==0){
runningProcess.status=3;
finishCount++;
executedProcesses.add(runningProcess.name); // 记录进程的执行顺序
System.out.println("时间"+currentTime+"完成进程"+runningProcess.name);
runningProcess=null;
}
currentTime++;
}
// 输出每个进程的执行顺序
System.out.print("进程执行顺序:");
for(String processName : executedProcesses){
System.out.print(processName + " ");
}
}
}
```
运行结果如下:
```
时间0运行进程p1,剩余时间3
时间1继续运行进程p1,剩余时间2
时间2继续运行进程p1,剩余时间1
时间3完成进程p1
时间3运行进程p2,剩余时间6
时间4继续运行进程p2,剩余时间5
时间5继续运行进程p2,剩余时间4
时间6继续运行进程p2,剩余时间3
时间7继续运行进程p2,剩余时间2
时间8继续运行进程p2,剩余时间1
时间9完成进程p2
时间9运行进程p3,剩余时间4
时间10继续运行进程p3,剩余时间3
时间11继续运行进程p3,剩余时间2
时间12继续运行进程p3,剩余时间1
时间13完成进程p3
时间13运行进程p4,剩余时间2
时间14完成进程p4
时间14运行进程p5,剩余时间5
时间15继续运行进程p5,剩余时间4
时间16继续运行进程p5,剩余时间3
时间17继续运行进程p5,剩余时间2
时间18继续运行进程p5,剩余时间1
时间19完成进程p5
进程执行顺序:p1 p2 p3 p4 p5
```
public static void main(String[] args) { // 初始化进程列表 List<Process> processes = new ArrayList<>(); processes.add(new Process("P1", 0, 0, 3)); processes.add(new Process("P2", 0, 2, 6)); processes.add(new Process("P3", 0, 4, 4)); processes.add(new Process("P4", 0, 6, 2)); processes.add(new Process("P5", 0, 8, 5)); int currentTime = 0; // 当前时间 int finishedCount = 0; // 已完成的进程数 Process runningProcess = null; // 当前正在运行的进程 while (finishedCount < processes.size()) { // 找到到达时间最早的进程 Process earliestProcess = null; for (Process process : processes) { if (process.status == 0 && process.arriveTime <= currentTime) { if (earliestProcess == null || process.arriveTime < earliestProcess.arriveTime) { earliestProcess = process; } } } if (earliestProcess != null) { // 运行进程 earliestProcess.status = 2; runningProcess = earliestProcess; System.out.println("时间 " + currentTime + " 运行进程 " + runningProcess.name + ",剩余时间 " + runningProcess.runTime); } else if (runningProcess != null) { // 继续运行进程 runningProcess.runTime--; System.out.println("时间 " + currentTime + " 继续运行进程 " + runningProcess.name + ",剩余时间 " + runningProcess.runTime); if (runningProcess.runTime == 0) { // 完成进程 runningProcess.status = 3; finishedCount++; System.out.println("时间 " + (currentTime + 1) + " 完成进程 " + runningProcess.name); runningProcess = null; } } currentTime++; } System.out.println("所有进程完成,总耗时 " + currentTime); } }什么意思
这段代码是一个简单的进程调度算法,使用的是先来先服务(FCFS)算法。在程序中,将进程存储在一个列表中,每个进程有四个属性:进程名、到达时间、开始时间和运行时间。程序先找到到达时间最早的进程,如果该进程已经到达,则运行它。如果当前没有进程在运行,则选择到达时间最早的进程开始运行。运行进程时,每个时间单位减少其运行时间,直到运行时间为零,则该进程完成。程序输出每个进程运行的开始时间,结束时间以及总耗时。