2011-03-16 127 views
1

我已經安排了一個TimerTask以固定的時間運行,間隔爲一天,使用java.util.Timer.scheduleAtFixedRate()。 TimerTask有一個邏輯來控制6個小時的持續時間。計時器假設在第二天同樣的時間開始這項任務。但有時只要在持續時間後停止,任務就會重新啓動。我沒有看到這種發生的任何模式,它只是隨機發生。我通過多次運行這個應用程序來測試它,但是無法識別任何特定的模式。java.util.Timer行爲奇怪

它是這樣的。

class App{ 
    public static void main(final String[] args) { 
    Timer timer = new Timer(); 
    ProcessManagerTask processManager = new ProcessManagerTask() 
    timer.scheduleAtFixedRate(processManager, today @ 01 AM, 1440 minutes)) 
    //some logic to keep this running forever 
    } 
} 

public class ProcessManagerTask extends TimerTask { 
    public ProcessManagerTask(){ 
    //end time = today @ 7 AM 
    } 
    public void run() { 
    while(end time is not expired){ 
     //do some stuff 
    } 
} 

ProcessManagerTask有時會立即在7時重新啓動(當任務結束時)。

編輯:夥計們任何想法爲什麼問題出現在計時器。我仍然無法弄清楚。

編輯[2011年4月8日]:定時器的問題仍然沒有解決。如果有人能提供幫助,我將不勝感激。

+1

我建議使用[ScheduledExecutorService](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html)。 – mre 2011-03-16 14:09:30

+1

可能會再次出現啓動程序的問題嗎?這跑步在哪裏? – jzd 2011-03-16 14:10:46

+0

我不明白你的問題。如果你的意思是OS在Windows上運行。這個應用程序作爲Windows服務運行,但即使通過命令提示符運行,這個問題即將到來。 – Amit 2011-03-16 14:14:32

回答

1

從文檔:

如果執行被延遲因爲任何原因(如垃圾回收或其他背景活性),會發生兩個或更多個執行快速連續「趕上」。

因此,看起來您的任務並沒有在凌晨1點執行,因此執行了兩次。

+0

該過程被控制在固定時間停止,在下次運行之前提供足夠的時間。凌晨1點開始,上午7點結束,下一次凌晨1點。 – Amit 2011-04-08 15:53:22

+0

大衛你是對的,它是由於超過下一個計劃時間。謝謝! – Amit 2011-06-01 08:25:14

1

由於您在Windows上運行此項。一種選擇是使用計劃任務來每天開始工作。一個很大的優點是,即使機器重新啓動,作業仍然會運行。在命令行啓動的東西將不得不重新啓動。

+0

爲了處理這個問題,我們已經將這個應用程序轉換爲一個windows服務,它被設置爲在Windows啓動時自動啓動。 – Amit 2011-03-16 14:46:20

+0

@Amit,這很好。但是,計劃任務似乎是一個更好的選擇,因爲此程序不輪詢任何內容,並且不需要一直運行。 – jzd 2011-03-16 14:48:24

+0

這看起來更像是一種臨時解決方案,可以避免完全解決實際問題。 – mre 2011-03-16 15:04:51