2012-10-10 152 views
0

當我嘗試運行(使用)最後一個方法時,它開始運行並永不停止。另外,當我嘗試打印出作業時,元素沒有正確打印。它帶有奇怪的字母。我在發佈整個類,因爲我猜測我除了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."); 
} 

} 
+0

是行'的System.out.println( 「Ajob運行」 + myJobInQueue.get(0));'不打印可言,或者將它打印意想不到的事情? –

+0

例如,我正在打印出作業正在運行作業[email protected]。 – user1721548

回答

2

基於您的評論的工作列表,行System.out.println("Ajob is running"+ myJobInQueue.get(0));是打印出由myJobInQueue.get(0)返回的Job對象引用。爲了讓該行打印出有意義的信息,請確保Job有一個toString方法,該方法返回描述該對象的String

我認爲你的第二個問題是由於myTimeLeft變量降到myJobDuration以下,但不低於0.我沒有看到你在這個窗口中的遞減myTimeLeft

邊注:所有的工作都有相同的時間?如果不是,那麼您應該使用下一個Job的持續時間,而不是全局變量myJobDuration

3

點1:myJobInQueue.get(0) 未打印正確的值。

這將打印正確的值,如果你的JobtoString()方法比爾在他的答案中提到。 另一種方法是調用你的Job類的getter方法,如果有的話,例如

myJobInQueue.get(0).getJobName(); 

點2:調試和看到的myTimeLeft的價值在於它真正零度以下的任何一點。

+0

在大家的幫助下回復我,我已經改變了'runAJob'方法,它似乎工作正常。 但也許我不我站下'toString'方法明確....我努力學習,從1類調用方法到另一個類。 我該怎麼做... 如果'Job'類有一個方法來'運行'個人作業本身,我想調用'Job'類中的'run'方法到'runAjob'方法。因此,當Job類中的run方法被執行時,它會連接到'runAjob'方法,以便它也被執行。 – user1721548

+0

Object的toString方法返回對象的字符串表示形式。看到這裏http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html – subodh

+0

我已經開始理解它,謝謝。 – user1721548

1

的問題不是對我來說太清楚,但此方案似乎是適當的使用Java併發包,尤其是執行人相關零部件Java concurrency: Executor Interfaces

我會使用一個執行器與單個線程worker(它發生在我身上,你希望你的工作一個接一個地完成,否則使用更多的線程),以及一個CountDownLatch與完成的作業數量。在將作業Runnables(將鎖存器遞減一次)提交給ExecutorService後,我會發出latch.await(超時)。

上第二個想法EDIT,你不需要用鎖的神奇,這些方針的東西就足夠了,我認爲:

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(); 
} 
1

在大家的幫助下回答我,我已經改變像上面的runAJob方法,它似乎工作正常。

但也許我不明白我的立場toString方法.... 我想學習從1類調用方法到另一個類?

什麼,我會做...

如果作業類必須運行單獨的工作本身的方法,我想打電話給在「作業」級的「跑」入法「runAjob」方法。因此,當Job類中的「run」方法得到執行時,它會連接到「runAjob」方法,以便它也被執行。

我的意思是,如果我們在myJobInQueue 2個掛起的作業。

0 - { 「做洗滌」 10分鐘}

1 - { 「庫克晚餐」 10分鐘}

2 - { 「洗車」 10分鐘}

,當我使用 「運行」方法myJobInQueue變爲

0 - { 「庫克晚餐」 10分鐘}

1 - { 「洗車」 10分鐘}

當我使用 「runAjob」 方法myJobInQueue成爲

0 - { 「洗車」 10分鐘}

我希望我做了這個問題不夠清楚。