我使用以下代码来安排计时器(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运行?
答案 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
}