Java 排队和出列程序运行时无法找出输出不匹配的原因

Java 排队和出列程序运行时无法找出输出不匹配的原因,java,queue,command-line-arguments,deque,Java,Queue,Command Line Arguments,Deque,这是hwk链接提示,可帮助解答任何问题。请阅读下面的内容,了解我的问题。这只是了解我的问题的信息 使用队列和堆栈,以作业的形式,我给了他一个家庭作业,它基本上接受一个输入文件,并编写一个命令参数来计算运行时间。im提供了一个如下所示的输入文件: Media Player 100 Angry Birds 140 然后,我们在jgrasp中键入一个参数,如“jobs.txt 50 1”,它表示文本文件、时间片和延迟。(见上面的链接) 以下是基于上述示例输入的程序执行示例: C:\classes\

这是hwk链接提示,可帮助解答任何问题。请阅读下面的内容,了解我的问题。这只是了解我的问题的信息

使用队列和堆栈,以作业的形式,我给了他一个家庭作业,它基本上接受一个输入文件,并编写一个命令参数来计算运行时间。im提供了一个如下所示的输入文件:

Media Player
100
Angry Birds
140
然后,我们在jgrasp中键入一个参数,如“jobs.txt 50 1”,它表示文本文件、时间片和延迟。(见上面的链接) 以下是基于上述示例输入的程序执行示例:

C:\classes\cscd300\queues>java QueueSimulation jobs.txt 50 1

Time Slice: 50
Latency: 1

Adding Jobs to Queue
--------------------
Media Player, 100 milliseconds to execute
Angry Birds, 140 milliseconds to execute

Begin Job Processing
--------------------
Executing Media Player, 100 milliseconds remaining
Executing Angry Birds, 140 milliseconds remaining
Executing Media Player, 50 milliseconds remaining
*Media Player finished, total time to execute was 153 milliseconds
Executing Angry Birds, 90 milliseconds remaining
*Angry Birds finished, total time to execute was 244 milliseconds
所有工作都完成了

这是我的代码:(下面有一个作业类、一个测试人员和一个linkedqueue类,我用它来创建我自己的带有排队和退队的类(hwk的一部分,我没有包括它,因为这是很多代码,只知道排队和退队都是方法)我的问题在测试人员中:

    public class Job {
    String jobName;
    int runTime;
    int remainTime;
    int startTime;

//constructures
    public Job() {
    jobName = "";
    runTime = 0;
    remainTime = 0;
    startTime = 0;
    }

    public Job(String _jobName, int _runTime) {
    jobName = _jobName;
    runTime = _runTime;
    remainTime = _runTime;
    startTime = 0;
    }
} 


public class QueueTester {
    public static void main(String[] args) {
        linkedQueue waitQ = new linkedQueue();
        linkedQueue runQ = new linkedQueue();
        String fileName = "no_fileName";
        int slice = 0, timeSW=0;
        if (args.length !=3) 
        throw new IllegalStateException("No command line arguments...\n");
        fileName = args[0];
        slice = Integer.parseInt(args[1]);
        timeSW = Integer.parseInt(args[2]); 
        System.out.println("\nTime Slice: " + slice);
        System.out.println("\nLatency: " +timeSW + "\n");
        Job job = null;
        try {
            FileInputStream fstream = new FileInputStream(fileName);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            System.out.println("adding jobs to queue");
            System.out.println("--------------------");
            boolean first = true;
            while ((strLine = br.readLine()) != null) {
                if (job == null)
                    job = new Job("", 0);

                strLine = strLine.trim();
                if (strLine.startsWith("#")) continue;
                if (strLine.length() == 0) continue;

                if (first) {
                    job.jobName = strLine;
                    first = false;
                } else {
                    job.runTime = Integer.parseInt(strLine);
                    job.remainTime = job.runTime;
                    job.startTime = 0;
                    System.out.println(job.jobName + ", " + job.runTime + "milliseconds to excecute.");
                    waitQ.enqueue(job); //enqueue
                    job = null;
                    first = true;
                }

            }
            in.close(); //close the input stream
        }
        catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
        Job waitJob;
        System.out.println("\nBegin Job Processing");
        System.out.println("---------------------");
        boolean done = false;
        int elapsed = 0;
        while (!done) {
            while(!waitQ.isEmpty()) {
                waitJob = (Job)waitQ.dequeue();//dequeue
                runQ.enqueue(waitJob); //enqueue
            }

            Job runJob;
            while (!runQ.isEmpty()) {
                runJob = (Job)(runQ.dequeue());
                System.out.println("excecuting [" +runJob.jobName + "] " + runJob.remainTime + "milliseconds remaining");
                if (slice < runJob.remainTime) {
                    runJob.remainTime -= slice;
                    if (runQ.isEmpty() && waitQ.isEmpty())
                        elapsed += slice;
                    else
                        elapsed += (slice + timeSW);

                    waitQ.enqueue(runJob);
                }else {
                    int num = runJob.runTime + timeSW + runJob.remainTime;
                    System.out.println("*" + runJob.jobName + ", total time to execute was " +num+ "milliseconds");

                    }
                }
            }
    }
}

如果您一次查看代码,就会发现您从未更新作业的运行时。从作业剩余时间中减去时间片后,您还应该更新作业已执行的时间

“愤怒的小鸟”运行了50毫秒(还剩下90毫秒),但一旦你把这项工作重新排队,你就失去了这些信息

编辑:如果你基本上想让我给你答案。下面是你需要添加的缺失部分

runJob.runtime += slice 

(您可以选择将每个作业的已用时间重新初始化为0,并将`runJob.runtime+=已用时间,因为已用时间已包括延迟)再次将作业排入队列之前。

如果查看代码一次,您将注意到您从未更新作业的运行时。从作业剩余时间中减去时间片后,您还应更新作业已执行的时间

“愤怒的小鸟”运行了50毫秒(还剩下90毫秒),但一旦你把这项工作重新排队,你就失去了这些信息

编辑:如果你基本上想让我给你答案。下面是你需要添加的缺失部分

runJob.runtime += slice 

(您可以选择将每个作业的已用时间重新初始化为0,并将`runJob.runtime+=已用时间,因为已用时间已包括延迟)在你再次排队作业之前。

hmmm这有点道理……那么什么是最好的解决方案呢?最好的解决方案?你的代码中缺少了一些东西。只需在运行时将作业花费的50毫秒添加到队列中,然后再将其添加回队列。没有,你的答案是正确的。我还没有更正它,但仍在处理它。我仍然无法我试着把它放进去,现在我的输出是*媒体播放器,执行的总时间是153毫秒*愤怒的小鸟,执行的总时间是193毫秒,所以它不工作,嗯,这有点道理…那么什么是最好的解决方案?最好的解决方案?你的代码中缺少了一些东西。是的在将作业添加回队列之前,请在运行时添加在作业上花费的50毫秒。不,您的答案是正确的。我还没有更正它,但仍在处理它。我仍然无法理解如何在代码中执行它?我尝试将其输入,现在我的输出是*媒体播放器,总执行时间是153毫秒*愤怒的小鸟,对吗执行的总时间为193毫秒,因此无法工作