当我尝试运行(使用)最后一个方法时,它开始运行并且永不停止。此外,当我尝试打印aJob时,元素无法正确打印。它出现了奇怪的字母。我发布了全班,因为我猜我除了runJod和runAll方法之外还在其他地方犯了一个错误。有谁能告诉我需要做些什么来解决这个问题?
import java.util.ArrayList;
/ ** * /
公共类JobQueue
{ private 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." );
}
}
答案 0 :(得分:3)
第1点:myJobInQueue.get(0)
没有打印正确的值。
如果您的Job
有toString()
方法,则会打印正确的值。
另一种方法是调用Job类的getter方法,如
myJobInQueue.get(0).getJobName();
Point2:调试它并看到myTimeLeft
的值,它在任何时候都真的低于零。
答案 1 :(得分:2)
根据您的评论,第System.out.println("Ajob is running"+ myJobInQueue.get(0));
行打印出Job
返回的myJobInQueue.get(0)
的对象引用。为了让该行打印出有意义的信息,请确保Job
有一个toString
方法,该方法返回描述该对象的String
。
我认为你的第二个问题是由myTimeLeft
变量低于myJobDuration
但不低于0引起的。我没有看到你在这个窗口中减少myTimeLeft
的位置。
备注:所有工作都有相同的持续时间吗?如果没有,那么您应该使用下一个Job
的持续时间而不是全局myJobDuration
变量。
答案 2 :(得分:1)
问题对我来说不太清楚,但这种情况似乎适合使用 Java并发包,尤其是执行者相关部分Java concurrency: Executor Interfaces 。
我会使用一个带有单个线程工作程序的执行程序(我想要你的工作逐个完成,否则使用更多的线程),以及一个CountDownLatch,其中包含要完成的工作数。在提交作业Runnables(一旦完成后将锁存器减少)提交给ExecutorService之后,我将发出latch.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();
}
答案 3 :(得分:1)
在每个人的帮助下回复我,我已经改变了上面的runAJob方法,似乎工作正常。
但也许我不能明确地遵守串通法...... 我正在努力学习从1个类调用方法到另一个类?
我该怎么做......
如果Job类有一个方法来运行单个作业本身,我想将“Job”类中的“run”方法调用为“runAjob”方法。因此,当Job类中的“run”方法被执行时,它会连接到“runAjob”方法,因此它也会被执行。
我的意思是如果myJobInQueue中有2个待处理的作业。
0 - {“洗涤”10分钟}
1 - {“烹饪晚餐”10分钟}
2 - {“洗车”10分钟}
当我使用“run”方法myJobInQueue时,
0 - {“烹饪晚餐”10分钟}
1 - {“洗车”10分钟}
和
当我使用“runAjob”方法myJobInQueue成为时,
0 - {“洗车”10分钟}
我希望我已经把这个问题弄清楚了。