【问题标题】:Execute Java Timer at every 2 hours每 2 小时执行一次 Java Timer
【发布时间】:2011-06-16 12:57:07
【问题描述】:

我有一个计时器例程,我想每两个小时执行一次。但是我下面的逻辑似乎比预期的执行得太早了。有谁知道我做错了什么?

         (new Timer()).scheduleAtFixedRate(new TimerTask()
          {

            @Override
            public void run()
            {

              try
              {                  
               //TODO: Perform routine.
              }
              catch (Exception ex)
              {
                try
                {
                  throw ex;
                }
                catch (Exception e)
                {

                }
              }
            }

          }, 0, (1000 * 60 * 120));

谢谢。

【问题讨论】:

  • 你的try-catch 看起来很糟糕...
  • “太早”是什么意思?
  • 虽然这不会改变您的结果,但您应该使用 TimeUnit。 TimeUnit.MILLISECONDS.convert(2, TimeUnit.HOURS)
  • @Martijn Try-catch 应该将异常传递给 main 以被捕获。
  • @John 我认为传递给初始延迟的值是它快速执行的原因。我的错。

标签: java timer scheduling


【解决方案1】:

根据javadoc,您的代码应立即触发例程(初始延迟为零),然后每 2 小时(120 分钟)触发一次。

scheduleAtFixedRate(TimerTask 任务, 长延迟,长周期)

调度指定任务以重复固定速率执行, 在指定的延迟之后开始。

如果你想在 2 小时后第一次触发,那么就这样做

long interval = 1000 * 60 * 120;
scheduleAtFixedRate(task, interval, interval)

【讨论】:

  • +1,用于解释他的代码出了什么问题,而不是提供完全不同的实现。
【解决方案2】:

尽可能使用Executors 框架而不是Timer

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable(){
    @Override
    public void run()
    {
        // do stuff
    }}, 0, 2, TimeUnit.HOURS);

【讨论】:

  • 请问这种方法有什么好处?以后如何停止任务?
  • @DNA 解释那里的优势之一是 Timer 在长时间任务的情况下会延迟,但 Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate 在长时间任务的情况下也会延迟,所以我没有得到优势。我正在寻找 fixRate ,但是从任务开始而不是在任务结束时有解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2012-02-11
  • 2015-11-20
  • 2012-10-03
  • 2021-12-03
  • 2012-09-02
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多