1

これは、質問がある場合に役立つ hwk リンク プロンプトです。私の質問を見るために以下を読んでください。これは私の質問が何であるかを理解するための単なる情報です

http://penguin.ewu.edu/cscd300/Spring_12/Assignments/prog2.html

ジョブの形でキューとスタックを使用して、基本的に入力ファイルを受け取り、実行時間を計算するコマンド引数を書き込む宿題を与えます。以下に示す入力ファイルが与えられます:

Media Player
100
Angry Birds
140

次に、「jobs.txt 50 1」のように jgrasp に引数を入力します。これは、テキスト ファイル、タイム スライス、およびレイテンシを意味します。(上記のリンクを参照) 上記のサンプル入力に基づくプログラム実行のサンプルを次に示します。

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");

                    }
                }
            }
    }
}

私のプログラムは動作しますが、出力は以下のようになります。私の質問は、なぜ正しく出力されないのですか? 出力が一致するようにテスター クラスを修正するのを手伝っていただければ、それは素晴らしいことです。エラーや追加する必要があるものを見つけるのを手伝ってください! :) *

Begin Job Processing
---------------------
excecuting [Media Player] 100milliseconds remaining
excecuting [Angry Birds] 140milliseconds remaining
excecuting [Media Player] 50milliseconds remaining
*Media Player, total time to execute was 151milliseconds
excecuting [Angry Birds] 90milliseconds remaining
excecuting [Angry Birds] 40milliseconds remaining
*Angry Birds, total time to execute was 181milliseconds
4

1 に答える 1

1

一度取得したコードを見ると、ジョブのランタイムを更新していないことがわかります。ジョブの残り時間からタイム スライスを差し引いた後、ジョブが実行された時間も更新する必要があります。

「怒っている鳥」は 50 ミリ秒 (残り 90 ミリ秒) 実行されましたが、そのジョブをキューに戻すと、その情報が失われます。

編集:基本的に私に答えてもらいたい場合。以下は、追加する必要がある欠けているビットです。

runJob.runtime += slice 

(それ以外の場合は、各ジョブの経過時間を 0 に再初期化し、経過時間には既に待機時間が含まれているため、`runJob.runtime += 経過時間を変更することを選択できます)、ジョブを再びキューに入れます。

于 2012-04-22T08:13:27.650 に答える