带延迟的Java计时器永远不会运行

时间:2017-09-20 12:48:27

标签: java task schedule

我有java.util.Timer类和TimerTask来安排,我想每天凌晨2点完成任务。

我的代码:

public class AutomaticPuller {

    final private Timer t = new Timer();

    public AutomaticPuller() {
        Calendar today = Calendar.getInstance();
        today.set(Calendar.HOUR_OF_DAY, 2);
        today.set(Calendar.MINUTE, 0);
        today.set(Calendar.SECOND, 0);
        long cooldown = today.getTimeInMillis();
        if (today.getTime().before(new Date(System.currentTimeMillis()))) {
            cooldown += 24L*60L*60L*1000L;  
        }
        System.out.println("Task will run at: " + new Date(cooldown));
        TimerTask tt = new TimerTask() {
            public void run() {
                try {
                    updateAll();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        t.schedule(tt, cooldown, 24L*60L*60L*1000L);
    }
}

我看到println的输出(任务将在:)运行但是应该在凌晨2点运行的任务永远不会执行,为什么?我不懂,我从未遇到过这样的问题。输出日志中没有错误。

2 个答案:

答案 0 :(得分:2)

因为您使用今天的时间(以毫秒为单位)作为执行任务之前的延迟(以毫秒为单位)。这意味着该任务将在大约47年内执行。

答案 1 :(得分:0)

通过添加以下行修复:

cooldown = cooldown - System.currentTimeMillis();

基本上我只是忘了从冷却时间中删除当前的毫秒数。