【发布时间】:2011-03-16 14:06:50
【问题描述】:
我已经使用 java.util.Timer.scheduleAtFixedRate() 安排了 TimerTask 在固定时间运行,间隔为一天。 TimerTask 具有控制执行时间的逻辑,例如 6 小时。计时器应该在第二天同一给定时间开始此任务。但有时任务会在持续时间结束后立即重新启动。我没有看到这种发生的任何模式,它只是随机发生的。我通过多次运行此应用程序对此进行了测试,但无法识别任何特定模式。
它是这样的。
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 点立即重新启动(当任务结束时)。
编辑:伙计们知道为什么 Timer 会出现问题。我还是想不通。
编辑 [2011 年 4 月 8 日]:Timer 的问题仍未解决。如果有人可以提供帮助,我将不胜感激。
【问题讨论】:
-
我推荐使用ScheduledExecutorService。
-
重新启动程序会不会有问题?这是在哪里运行的?
-
我不清楚您的询问。如果您的意思是操作系统,它在 Windows 上运行。此应用程序作为 Windows 服务运行,但即使我通过命令提示符运行此问题也会出现。
-
你尝试过新手建议吗?我的理解是 Timer 类是为小型轻量级任务设计的——你所描述的听起来更重。如果可能的话,我会推荐其他建议放弃 java 计时器/调度程序并将其放入 cron (linux) 或作为计划任务 (windows) - 将其包装在 bat/shell 中将是微不足道的脚本来完成这个。
-
感谢@Tofarr 的回复。正如我在其他 cmets 中提到的那样,我无法切换到 cron 作业或 windows 调度程序,因为这是架构师做出的设计决策,因为他们希望应用程序一直运行并且所需的进程应该在应用程序内进行控制。