JAVA如果我在每天中午12点之后安排我的时间表,会发生什么?

时间:2015-04-08 14:28:22

标签: java timer timertask

我使用以下代码来安排计时器(java.util.Timer):

Timer mytimer = new Timer("My Timer");
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 12);
mytimer.schedule(mytask, c.getTime(), 24*60*60*1000);

我希望计时器任务每天中午12点运行。 我的问题是如果应用程序在12:00之后运行会发生什么。我们先说16:00。计时器任务是否会在第二天的12:00运行?

4 个答案:

答案 0 :(得分:2)

Timer Class的文档说明了方法public void schedule(TimerTask task, Date firstTime, long period)

的以下内容
  

在固定延迟执行中,每次执行都是相对于上一次执行的实际执行时间进行调度的。如果执行因任何原因(例如垃圾收集或其他后台活动)而延迟,则后续执行也将延迟。从长远来看,执行频率通常会略低于指定时间段的倒数(假设Object.wait(long)下的系统时钟是准确的)。由于上述原因,如果计划的第一时间是过去,则计划立即执行

因此我们可以从上面了解到任务将立即安排并执行,之后根据您的程序将在24小时后再次执行。因此,如果是16:00那么它将立即执行,并将在第二天的16:00再次执行。

答案 1 :(得分:2)

您可以考虑使用ScheduledThreadPoolExecutor作为

  

它实际上是一种更通用的替代品   定时器/ TimerTask组合   (link)

此外,Java 8提供了一些有用的工具来进行所需的时间计算。一个例子可能是:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

public void schedule(Runnable command) {
    LocalDateTime currentTime = LocalDateTime.now();

    LocalDateTime executionDate = LocalDateTime.of(currentTime.getYear(), 
                                                   currentTime.getMonth(), 
                                                   currentTime.getDayOfMonth(), 
                                                   12, 0); // begin execution at 12:00 AM

    long initialDelay;

    if(currentTime.isAfter(executionDate)){
        // take the next day, if we passed the execution date
        initialDelay = currentTime.until(executionDate.plusDays(1), ChronoUnit.MILLIS);
    } else {
        initialDelay = currentTime.until(executionDate, ChronoUnit.MILLIS);
    }

    long delay = TimeUnit.HOURS.toMillis(24); // repeat after 24 hours

    ScheduledFuture<?> x = scheduler.scheduleWithFixedDelay(command, initialDelay, delay , TimeUnit.MILLISECONDS);
}

答案 2 :(得分:0)

您可以花11:59 PM的时间解决问题。 之所以调用它,是因为12:00 PM日期将被更改,因此它将调用您的任务。 因此将时间12:00 PM更改为11:59

答案 3 :(得分:-1)

我一直在寻找同一问题的答案,并想出了一个可能的解决方案。请记住,我是一个完全新手,因此可能会犯下许多编程犯罪。

如果您的计时器无论如何都在运行,为什么不像这样检查特定时间:

if(date.compareTo("00:00:00") == 0){
    //TODO
}