为了账号安全,请及时绑定邮箱和手机立即绑定

Timer 任务中的 Run 方法执行了两次

Timer 任务中的 Run 方法执行了两次

慕桂英546537 2023-05-24 16:18:17
我创建了一个每 20 秒运行一次的计时器。计时器任务需要超过一分钟才能完成任务。定时器任务中的 run 方法在定时器任务完成前 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 秒。我希望数据库中只有一条记录 非常感谢对此的任何帮助。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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

在固定速率执行中,每次执行都是相对于初始执行的调度执行时间进行调度的。如果执行因任何原因(例如垃圾回收或其他后台活动)而延迟,则将快速连续执行两次或更多次以“赶上进度”。从长远来看,执行频率将恰好是指定周期的倒数(假设 Object.wait(long) 底层的系统时钟是准确的)。

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

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


查看完整回答
反对 回复 2023-05-24
?
RISEBY

TA贡献1856条经验 获得超5个赞

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



查看完整回答
反对 回复 2023-05-24
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这很好用


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();

    }


}



查看完整回答
反对 回复 2023-05-24
  • 3 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信