【问题标题】:java.util.Timer behaving strangelyjava.util.Timer 行为异常
【发布时间】: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 调度程序,因为这是架构师做出的设计决策,因为他们希望应用程序一直运行并且所需的进程应该在应用程序内进行控制。

标签: java timer


【解决方案1】:

来自文档:

如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续执行两次或多次执行以“赶上”。

因此,您的任务似乎没有在凌晨 1 点执行,因此执行了两次。

【讨论】:

  • 进程被控制在一个固定时间停止,这在下次运行之前提供了足够的时间。凌晨 1 点开始,早上 7 点结束,下一次跑步是第二天凌晨 1 点。
  • 大卫你是对的,这是由于超过了下一个计划时间。谢谢!
【解决方案2】:

因为您在 Windows 上运行它。一种选择是使用计划任务每​​天开始工作。一个很大的优势是即使重新启动机器,作业仍然会运行。在命令行启动的东西必须重新启动。

【讨论】:

  • 为了处理这个问题,我们已将此应用程序转换为 Windows 服务,该服务设置为在 Windows 启动时自动启动。
  • @Amit,很好。但是,计划任务似乎是更好的选择,因为该程序不会轮询任何内容,也不需要一直运行。
  • 这似乎更像是一个临时解决方案,避免完全解决真正的问题。
  • @DLK,我同意它避免了问题的根本原因,但我认为这个问题不应该被解决,因为它不应该从一开始就 24/7 运行。
  • 抱歉忘记了不能使用windows计划任务,因为除了提到的计划任务之外还有其他事情发生在定时器之外。所以这仍然让问题悬而未决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2017-01-22
  • 2013-04-14
  • 2014-01-29
相关资源
最近更新 更多