Java 无限while循环,can';我不明白为什么

Java 无限while循环,can';我不明白为什么,java,Java,我最近刚在我的大学开始学习编程,到目前为止,我们正在与Java进行斗争。我们的任务是模拟不同的处理器算法,如fcfs、sjf等。我已经尝试了许多方法,下面看到的方法可能是优化程度最低的。我知道,这段代码可能不是最好的,也不是最好的算法本身,但我想看看它是否按预期工作,我发现了一个问题,我不能真正理解太久了,我将无法入睡,直到我发现它出了什么问题 在下面的代码中,您会发现一个while循环,注释行“Why is this loop inifnite”是用大写字母写的。我不知道为什么它从来没有停止过

我最近刚在我的大学开始学习编程,到目前为止,我们正在与Java进行斗争。我们的任务是模拟不同的处理器算法,如fcfs、sjf等。我已经尝试了许多方法,下面看到的方法可能是优化程度最低的。我知道,这段代码可能不是最好的,也不是最好的算法本身,但我想看看它是否按预期工作,我发现了一个问题,我不能真正理解太久了,我将无法入睡,直到我发现它出了什么问题

在下面的代码中,您会发现一个while循环,注释行“Why is this loop inifnite”是用大写字母写的。我不知道为什么它从来没有停止过(我运行了一些打印测试,我知道这是一个永远都在进行的循环),它真的让我很不安(很可能是因为现在解决方案非常简单)

一些解释:我创建了一个进程列表,然后在上面执行一些方法。过程描述为:执行时间(execTime);等待开始执行所需的时间(waitTime);它准备执行的时间(inTime)(但可能正在等待其他进程完成执行)和id。我通过减少进程的execTime来执行进程,直到它达到0,然后删除进程并对“新的第一个”执行相同的操作。这个缩减部分是当程序变为无穷大时

芒果

import java.util.ArrayList;
导入java.util.List;
公共类处理器{
List listOP=new ArrayList();
int processorTime=0;
int totalWaitTime=0;
int numberofprocesss=0;
公共处理器(){
对于(int i=0;i0)
listOP.get(i).inTime+=listOP.get(i-1).inTime+(int)((Math.random()+0.1)*10);
System.out.println(“Proces”+(listOP.get(i.id+1)+“czas wejścia”+listOP.get(i.inTime);
}
}
公共双fcfs(){
numberofprocesss=listOP.size();
while(listOP.size()!=0){
if(listOP.get(0.inTime>processorTime){

对于(int i=0;i execTime初始化为什么值?请尝试将
!=
更改为
。调试它时,
listOP.get(0).execTime
有什么值?它是如何更改的?能否确认
listOP.get(0).execTime--
有效?能否共享listOP.get(0)中调用的java对象?@John3136实际上我没有考虑调试这个部分。感觉更糟的是,我想这应该是我检查的第一件事。它变成了非常低的负数。@csirmazbeneguz实际上起到了作用,它现在停在了应该停的地方。它被初始化为数学变体给出的一些随机数。random().你能解释一下为什么改成“>”会有帮助吗?
import java.util.ArrayList;
import java.util.List;

public class Processor {

List<Process> listOP = new ArrayList<Process>();
int processorTime = 0;
int totalWaitTime = 0;
int numberOfProcesses = 0;

public Processor(){
    for(int i=0; i<100; i++){
        listOP.add(new Process(i));
        if(i>0)
            listOP.get(i).inTime += listOP.get(i-1).inTime + (int)((Math.random() + 0.1)*10);
        System.out.println("Proces " + (listOP.get(i).id + 1) + " czas wejścia " + listOP.get(i).inTime);
    }
}

public double fcfs(){
    numberOfProcesses = listOP.size();
    while(listOP.size() != 0){
        if(listOP.get(0).inTime > processorTime){
            for(int i=0; i<listOP.size(); i++){
                listOP.get(i).waitTime = 0;
            }
        }
            totalWaitTime += listOP.get(0).waitTime;
            while(listOP.get(0).execTime != 0){//**WHY IS THIS LOOP INFINITE**
                for(int i=1; i<listOP.size(); i++){
                    if(processorTime == listOP.get(i).inTime)
                        listOP.get(i).waitTime++;
                }
                listOP.get(0).execTime--;
                processorTime++;
            }
            processorTime++;
        listOP.remove(0);
    }
    System.out.println(totalWaitTime);
    System.out.println(numberOfProcesses);
    System.out.println(processorTime);
    System.out.println("Średni czas tego ciągu procesów: " + totalWaitTime/numberOfProcesses);
    return totalWaitTime/numberOfProcesses;
}
}