我希望能够在 Java 中的特定时间安排任务。我知道ExecutorService
有能力定期安排,并在指定的延迟之后,但我更多的是在一天中的某个时间而不是在一段时间之后。
有没有办法Runnable
在 2:00 执行,或者我需要计算从现在到 2:00 之间的时间,然后安排 runnable 在该延迟之后执行?
我希望能够在 Java 中的特定时间安排任务。我知道ExecutorService
有能力定期安排,并在指定的延迟之后,但我更多的是在一天中的某个时间而不是在一段时间之后。
有没有办法Runnable
在 2:00 执行,或者我需要计算从现在到 2:00 之间的时间,然后安排 runnable 在该延迟之后执行?
你也可以使用spring注解
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html
这就是我使用java7SE解决它的方法:
timer = new Timer("Timer", true);
Calendar cr = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cr.setTimeInMillis(System.currentTimeMillis());
long day = TimeUnit.DAYS.toMillis(1);
//Pay attention - Calendar.HOUR_OF_DAY for 24h day model
//(Calendar.HOUR is 12h model, with p.m. a.m. )
cr.set(Calendar.HOUR_OF_DAY, it.getHours());
cr.set(Calendar.MINUTE, it.getMinutes());
long delay = cr.getTimeInMillis() - System.currentTimeMillis();
//insurance for case then time of task is before time of schedule
long adjustedDelay = (delay > 0 ? delay : day + delay);
timer.scheduleAtFixedRate(new StartReportTimerTask(it), adjustedDelay, day);
//you can use this schedule instead is sure your time is after current time
//timer.scheduleAtFixedRate(new StartReportTimerTask(it), cr.getTime(), day);
它碰巧比我想象的要正确地做起来更棘手
你会想要Quartz。
今天早上遇到这种情况......这是我在午夜运行的代码
scheduler = Executors.newScheduledThreadPool(1);
Long midnight=LocalDateTime.now().until(LocalDate.now().plusDays(1).atStartOfDay(), ChronoUnit.MINUTES);
scheduler.scheduleAtFixedRate(this, midnight, 1440, TimeUnit.MINUTES);
查看石英。我们将它用于我们的生产应用程序,它非常好。它的工作原理很像 crontab。您可以在设定的计划中指定一个时间,它会在那个时候执行一个回调。
用户java.util.Timer
. schedule(task, time)
当您想要执行一次任务时,它有方法 new其中 time 是 Date 。