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

我创建了一个每 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 秒。我希望数据库中只有一条记录 非常感谢对此的任何帮助。


慕桂英546537
浏览 228回答 3
3回答

慕田峪4524236

按照意图,如果第一次执行花费的时间超过 20 秒,则第二次执行将在之后立即开始。如果第一次执行超过 40 秒,第三次执行将在第二次执行后立即开始。依此类推,直到您在 N 秒后赶上大约 N/20 次执行。在固定速率执行中,每次执行都是相对于初始执行的调度执行时间进行调度的。如果执行因任何原因(例如垃圾回收或其他后台活动)而延迟,则将快速连续执行两次或更多次以“赶上进度”。从长远来看,执行频率将恰好是指定周期的倒数(假设 Object.wait(long) 底层的系统时钟是准确的)。如果您两次插入相同的数据,那么问题似乎在于您决定是否已经插入该数据,而不是执行之间的间隔。如果任务运行了大约一分钟,这是否表明存在错误,或者需要多长时间(例如连接到远程数据库)?

RISEBY

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

慕盖茨4494581

这很好用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();    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java