Schulding任务每天凌晨12点运行的问题-Java

时间:2019-06-17 11:40:01

标签: java timer

我想当天凌晨12点执行任务。 我当前的代码如下:

 long currennTime = System.currentTimeMillis();
        long stopTime = currennTime + 2000; //provide the 2hrs time it should execute 1000*60*60*2
        while(stopTime != System.currentTimeMillis())
        {

My task();
}

 private static Date getTomorrowMidNight()
    {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0); //anything 0 - 23
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        Date midnight = c.getTime();

        return midnight;
    }


    public static void startTask(){
        Timer_Tasks task = new Timer_Tasks();
        Timer timer = new Timer();
        timer.schedule(task,getTomorrowMidNight(),1000*10);
    }



    public static void main(String args[])
    {
        startTask();
    }

任务每24小时保持运行一次,这可能是问题所在?

谢谢

2 个答案:

答案 0 :(得分:0)

除了Rashin的评论外,我还建议您不要使用while(stopTime != System.currentTimeMillis())。那是一个非常具体的条款,该过程可能不会检查确切的毫秒时间。卡在该循环中很容易。

一种更好的方法是检查您的超时时间是否已过去:

long end = System.currentTimeMillis();
long start = System.currentTimeMillis();
long stopTime = start + 2000;
while(end-start<stopTime) {
    My task();
    end = System.currentTimeMillis();
}

答案 1 :(得分:-1)

另一个选择是使用来自Spring的@Scheduled注释以及所需的CRON表达式对方法进行注释。 例如:

@Scheduled(cron = "0 00 00 * * ?")
public void doSomething() {}

您必须通过在配置中添加@EnableScheduling来在应用程序中启用弹簧调度,以使其起作用。