【问题标题】:Run method in Timer task is executing two timesTimer 任务中的 Run 方法正在执行两次
【发布时间】:2019-08-08 01:07:54
【问题描述】:

我创建了一个每 20 秒运行一次的计时器。计时器任务需要一分钟以上才能完成任务。 Timer 任务中的 Run 方法在 Timer 任务完成前 20 秒后执行两次。

class A {

    static Timer timer; 

    TimerTask timertask = new TimerTask({
        public void run(){
            if(check for some data in the database before inserting )
            // Insert records into database 
        }
    }

    public test(){
        A.timer.scheduleAtFixedRate(imertask,0, 20*1000); 
    }
}

相同数据的两条记录插入数据库,时间差为14秒。我希望数据库中只有一条记录对此的任何帮助非常感谢。

【问题讨论】:

    标签: java timer


    【解决方案1】:

    根据意图,如果第一次执行时间超过 20 秒,则第二次执行将在之后立即开始。如果第一次执行时间超过 40 秒,则第三次执行将在第二次执行后立即开始。以此类推,直到您在 N 秒后赶上大约 N/20 次执行。

    Documentation link

    在固定速率执行中,每次执行都是相对于 初始执​​行的预定执行时间。如果执行是 因任何原因延迟(例如垃圾收集或其他背景 活动),两个或多个处决将快速连续发生 “跟上来。”从长远来看,执行频率将是 正好是指定周期的倒数(假设系统 底层 Object.wait(long) 的时钟是准确的)。

    如果您要插入两次相同的数据,那么问题似乎在于您决定是否已经插入了该数据,而不是执行之间的间隔。

    如果任务运行大约一分钟,这是否表明存在错误,或者需要多长时间(例如连接到远程数据库)?

    【讨论】:

    • 感谢@another-dave 的回答。我期待在第一个任务完成之前,第二个任务将在队列中。我正在将数据插入 30 个表中。所以这需要时间。完成后,我正在检查是否有记录,然后插入一个新记录。我很困惑记录被插入时差为 14 秒。
    • 哦,等等。也许我误读了你的问题。预期的行为是第二​​次“运行”在第一次“运行”完成后立即开始。你说它同时运行?你是怎么确定的?如果我们考虑您的“14 秒差异”,那么该记录可能在第一次运行时插入相当晚,然后在第二次运行时再次插入相当早 - 所以在此基础上它不能证明运行是同时的。
    • 它同时运行。我在插入系统时间的表之一中有一列。我检查了那个。相差 14 秒。
    • 我试图解释我不认为它证明了并发性。此时,我将插入打印/记录语句作为“运行”方法的第一行和最后一行,包括当前时间。
    • 是的,我认为它不是同时启动的,但是 20 秒后,我认为它正在启动一个新线程并执行计时器任务
    【解决方案2】:

    效果很好

    class A {
    
        static Timer timer;
    
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Task is running");
            }
        };
    
        public void test() {
            timer = new Timer();
            timer.scheduleAtFixedRate(timerTask, 0, 5 * 1000);
    
        }
    
            public static void main(String[] args) {
            A a = new A();
            a.test();
        }
    
    }
    

    【讨论】:

    • 感谢阿卜杜拉。我忘了添加 timer = new Timer();在我的代码中。它工作正常,但是当 Timer 任务花费超过一分钟时,它会运行两次,这是一个问题。
    【解决方案3】:

    我不明白为什么 Timer 任务同时运行。我已经使用 Thread 编写了相同的逻辑和调度,现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多