2010-02-15 39 views

回答

19

定時器的documentation說以下內容:

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

也就是說,併發TimerTask線程將不會運行。任務將堆積成隊列。這可能會也可能不合適(更可能,不是)。

+7

我喜歡你描述的方式「任務將堆積成隊列。」肯定比文檔描述爲「豬」和「聚集」更好。特別是對那些英語不好的人xD – GMsoF

15

TimerTimerTask不好處理這種情況。如果你想更好地處理它,那麼不要使用這些類。

java.util.concurrent.ScheduledExecutorService提供了兩種調度方法,scheduleAtFixedRatescheduledWithFixedDelay,它們支配任務「聚合」時發生的情況。

scheduleAtFixedRate

創建並執行成爲 給定的初始延遲之後第一啓用的定期操作 ,隨後 與給定的週期;即 執行後將開始 initialDelay然後initialDelay +期間, 然後initialDelay + 2 *期間,所以 上。如果任務 的任何執行遇到異常,則後續的 執行被禁止。否則, 該任務將只能通過 終止取消或終止執行人 。如果此 任務的任何執行花費的時間超過其時間段 ,則隨後的執行可能會延遲啓動 ,但不會同時執行 。

scheduleWithFixedDelay

創建並執行成爲 給定的初始延遲之後第一啓用的定期操作 ,隨後 與 終止一個執行和 開始之間的給定的延遲的下一個。如果任務的任何執行遇到 異常,則會禁止後續執行 。否則,任務 只會通過取消或 終止執行程序終止。

您可以使用Executors工廠類創建ScheduledExecutorService實例。

+0

感謝您回答修復問題 –

+2

'scheduleAtFixedRate'比'Timer'和'TimerTask'更好嗎?兩者都確保以固定的時間間隔發生,並且如果間隔溢出到下一次執行,則執行將排隊。 – SexyBeast

相關問題