0

当我尝试运行(使用)最后一种方法时,它开始运行并且永不停止。此外,当我尝试打印出 aJob 时,该元素无法正确打印出。它带有奇怪的字母。我发布了整个课程,因为我猜除了 runJod 和 runAll 方法之外,我在其他地方犯了错误。谁能告诉我我需要做什么来解决这个问题?

导入 java.util.ArrayList;

/** */

公共类作业队列

{ 私有 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) 没有打印正确的值。

如果你JobtoString()比尔在他的回答中提到的方法,这将打印正确的值。另一种方法是调用 Job 类的 getter 方法,如果有的话

myJobInQueue.get(0).getJobName();

Point2:调试它并查看它的值myTimeLeft是否真的在任何时候都低于零。

于 2012-10-10T12:56:52.867 回答
2

根据您的评论,该行System.out.println("Ajob is running"+ myJobInQueue.get(0));正在打印Job返回的对象引用myJobInQueue.get(0)。为了使该行打印出有意义的信息,只需确保Job有一个toString返回String描述对象的方法。

我认为您的第二个问题是由低于 0 但不低于 0 的myTimeLeft变量引起的。当它在此窗口中时,myJobDuration我看不到您在哪里递减。myTimeLeft

旁注:所有工作的持续时间都相同吗?如果没有,那么您可能应该使用下一个持续时间Job而不是全局myJobDuration变量。

于 2012-10-10T12:44:32.703 回答
1

这个问题对我来说不是太清楚,但是这种场景似乎适合使用Java 并发包,尤其是Executor相关部分Java concurrency: Executor Interfaces

我会使用一个带有单线程工作程序的执行器(我突然想到你希望你的作业一个接一个地完成,否则使用更多的线程),以及一个带有要完成的作业数量的 CountDownLatch。在向 ExecutorService 提交作业 Runnables(一旦完成就会减少闩锁)后,我会发出闩锁.await(超时)。

再想一想,你不需要闩锁的魔力,我认为这些方面的东西就足够了:

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 回答