0

最後のメソッドを実行(使用)しようとすると、実行が開始され、停止することはありません。また、aJob を印刷しようとすると、要素が正しく印刷されません。変な文字で出てきます。runJod および runAll メソッド以外のどこかで間違いを犯していると推測しているため、クラス全体を投稿しています。これを修正するために何をする必要があるか誰か教えてください。

import java.util.ArrayList;

/** */

パブリック クラス JobQueue

{ プライベート ArrayListmyJobInQueue; // 実行するジョブのリスト

private ArrayList<Job>myFinishedJobs;// a list of compleated job

private int myJobDuration; //duration if one job

private int myTimeLeft;//total time left 
/**
 * Constructor for objects of class JobQueue
 */
 public JobQueue()
{
  myJobInQueue = new ArrayList<Job>();
  myFinishedJobs = new ArrayList<Job>();
  myJobDuration =0; 
  myTimeLeft=0;  
}

/**
 * Return the list of jobs that have not been completed (including the current job).
 */
 public ArrayList<Job> getPendingJobs()
 {
  return myJobInQueue;  
 }

/**
 * Return the list of jobs that have been completed.
 */
 public ArrayList<Job> getCometedJobs()
 {
  return myFinishedJobs;
 } 

/**
 * Return the job at the front of the pending queue, or null if the queue is empty.
 */
 public Job getCurrentJob()
 {
   if(myJobInQueue!=null)
   { 
    Job FirstJobInTheQueue = myJobInQueue.get(0);   
    return FirstJobInTheQueue;
   }
   else
   {
    return null;
   }

 } 

/**
 * Return the amount of time left on the clock (as an integer)
 */
 public int getTimeLeft()//Ok
 {
   return myTimeLeft; 
 }

/**
 * Return the total duration of all the pending jobs(as an integer).
 */

 public int getTotalDuration()
 {
   int myTimeLeft= 0;
   for(int i = 0; i<myJobInQueue.size();i++)
   {
       int num = myJobInQueue.getDuration(i); //I think this line is wrong. 
       myTimeLeft = myTimeLeft + num ;
   }
   return myTimeLeft;
 }

/**
 * Add a Job to the end of the Queue
 */ 
 public void addJob(Job job)
 {   
    if(job!=null)
    {
      myJobInQueue.add(job);
    }
 }

/**
  * Add the specified number of seconds to the clock.
  */
 public void addTime(int seconds)
 {
    if(seconds>0)
    {
      myTimeLeft = myTimeLeft  + seconds;
    }
 }

 /**
  * Run the first job on the queue if there is enough time on the clock and the job queue list is not empty.
  * And move the job to the finished jobs list.
  */

 public void runAJob(){
   if(!myJobInQueue.isEmpty())
   {
        myJobDuration = myJobInQueue.get(0).getDuration();
        if (myJobDuration < myTimeLeft)
        {
            myTimeLeft = myTimeLeft - myJobDuration;
            myFinishedJobs.add(myJobInQueue.get(0));
            System.out.println("A job is running: " + myJobInQueue.get(0).getName());
            myJobInQueue.remove(0);
        }
        else 
        {
            System.out.println("Not enogth running time left, please add time on the clock.");             
        }
   }
   else 
   {
     System.out.println("No pending job on the list.");
   }
}

/**
  * Run all the jobs on the queue in order until it runs out of time.
 */   


public void runAll()
{
  for(int i = 0; myTimeLeft > 0 && myTimeLeft > myJobDuration;i++);
  {
    runJob();

  }
   System.out.println("Job can not be run, not enough time left." );   
}

}
4

4 に答える 4

3

ポイント1:myJobInQueue.get(0) 正しい値を出力していません。

ビルが彼の答えで述べたように、メソッドJobがある場合、これは正しい値を出力します。toString()別のアプローチは、 Job クラスの getter メソッドを呼び出すことです。

myJobInQueue.get(0).getJobName();

Point2: デバッグして、myTimeLeftどの時点でも実際に 0 を下回っているかどうかを確認します。

于 2012-10-10T12:56:52.867 に答える
2

あなたのコメントに基づいて、行は返されSystem.out.println("Ajob is running"+ myJobInQueue.get(0));た のオブジェクト参照を出力しています。その行が意味のある情報を出力するためには、オブジェクトを説明するを返すメソッドがあることを確認してください。JobmyJobInQueue.get(0)JobtoStringString

あなたの 2 番目の問題は、変数が 0 より下ではなく よりmyTimeLeft下に落ちたことが原因だと思います。myJobDurationmyTimeLeft

補足: すべてのジョブの期間は同じですか? そうでない場合は、おそらくグローバル変数Jobの代わりに次の期間を使用する必要があります。myJobDuration

于 2012-10-10T12:44:32.703 に答える
1

問題は私にはあまり明確ではありませんが、このシナリオは、Java 同時実行パッケージ、特にExecutor関連部分のJava 同時実行: Executor Interfacesを使用するのに適しているよう です。

シングル スレッド ワーカー (ジョブを 1 つずつ完了させたい場合、そうでなければ、より多くのスレッドを使用する必要があると思います) を持つエグゼキュータと、完了するジョブの数を持つ CountDownLatch を使用します。そして、ジョブ Runnables (終了するとラッチをデクリメントする) を ExecutorService に送信した後、latch.await(timeout) を発行します。

考え直して編集します。ラッチを使用した魔法は必要ありません。これらの行に沿ったもので十分だと思います:

public void runMyJobs(List<Runnable> myJobs, long timeout, TimeUnit unit) throws InterruptedException {

  ExecutorService e = Executors.newFixedThreadPool(1);
  for(Runnable job: myJobs) {
    e.execute(job);    
  }

  e.awaitTermination(timeout, unit);
  List<Runnable> notCompletedJobs = e.shutdownNow();
}
于 2012-10-10T12:57:47.167 に答える
1

みんなの助けを借りて、上記のように runAJob メソッドを変更しましたが、問題なく動作しているようです。

しかし、私は toString メソッドを明確に理解していないかもしれません.... あるクラスから別のクラスにメソッドを呼び出すことを学ぼうとしていますか??

私は何をしなければならないでしょうか...

Job クラスに個々のジョブ自体を実行するメソッドがあり、「Job」クラスの「run」メソッドを「runAjob」メソッドに呼び出したい場合。したがって、Job クラスの「run」メソッドが実行されると、「runAjob」メソッドに接続されるため、同様に実行されます。

myJobInQueue に保留中のジョブが 2 つあるとします。

0-{「洗濯をする」10分}

1-{「夕食を作る」10分}

2-{「洗車」10分}

「実行」メソッドを使用すると、myJobInQueue は次のようになります。

0-{"夕食を作る" 10分}

1-{「洗車」10分}

「runAjob」メソッドを使用すると、myJobInQueue は次のようになります。

0-{「洗車」10分}

この質問が十分に明確になったことを願っています。

于 2012-10-11T01:31:56.620 に答える