2013-08-20 63 views
2

在下面的代碼中,是否可以重新使用同一個timer1對象而不是timer2來調用timertask?定時器實例是否可以在java中重用?

  Timer timer1 = new Timer(); 

     timer1.scheduleAtFixedRate(new TimerTask() { 
     int counter = 0; 
     @Override 
     public void run() { 
      PriorityQueueHandler.getQueueInstance().addToQueue(passengers.get(counter)); 
      counter++; 
      if(counter == passengers.size()){ 
       counter = 0; 
      } 
     } 
    }, DELAY, ARRIVAL_INTERVAL); 

    PriorityQueueHandler.getQueueInstance().print(); 

    Timer timer2 = new Timer(); 

    timer2.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      PriorityQueueHandler.getQueueInstance().print(); 
     } 
    }, DELAY, BOOKING_INTERVAL); 
+1

那麼,如果你*嘗試*會發生什麼? –

回答

2

是的,這應該是罰款 - 如果你滿意的任務順序運行。從the docs

對應於每個Timer對象是一個後臺線程,用於按順序執行所有計時器的任務。計時器任務應該快速完成。如果一個計時器任務需要花費過多時間才能完成,它會「佔用」計時器的任務執行線程。反過來,這可能會延遲後續任務的執行,這些任務可能會「聚集起來」並在(如果)違規任務最終完成時快速連續執行。

它的優良有許多計劃任務:

實現注意事項:此類可擴展到大量同時安排的任務(千應該不會出現什麼問題)。在內部,它使用二進制堆來表示其任務隊列,因此調度任務的成本爲O(log n),其中n是併發計劃任務的數量。

就我個人而言,我可能會使用ScheduledExecutorService來更好地控制任務之間創建的線程和併發性,但這是一個稍微不同的問題。

3

您可以重複使用一個計時器實例執行多個任務。注意,一個定時器在一個單線程中執行所有任務同步,這意味着如果一個任務被停止,這將影響在同一個定時器上調度的其他任務,即另一個任務不會被執行。

相關問題