如何使用Java在特定时间启动方法?
我希望我的程序在晚上9点时调用一个方法 那么,是否有一个侦听器可以在某个时间连续检查并触发一个方法 如果不是,我如何让程序每60秒调用一个方法如何使用Java在特定时间启动方法?,java,time,Java,Time,我希望我的程序在晚上9点时调用一个方法 那么,是否有一个侦听器可以在某个时间连续检查并触发一个方法 如果不是,我如何让程序每60秒调用一个方法 非常感谢您必须使用任何调度程序。我建议使用QuartzJob。您将需要: class MyJob implements Job { public void execute (JobExecutionContext ctx) { } } CronTrigger: CronTrigger trigger = new CronTrigger
非常感谢您必须使用任何调度程序。我建议使用QuartzJob。您将需要:
class MyJob implements Job {
public void execute (JobExecutionContext ctx) {
}
}
CronTrigger:
CronTrigger trigger = new CronTrigger();
trigger.setName("myTrigger");
trigger.setCronExpression("0 * * * * ?");
和一个新的调度程序:
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
您必须使用任何调度程序。我建议使用QuartzJob。您将需要:
class MyJob implements Job {
public void execute (JobExecutionContext ctx) {
}
}
CronTrigger:
CronTrigger trigger = new CronTrigger();
trigger.setName("myTrigger");
trigger.setCronExpression("0 * * * * ?");
和一个新的调度程序:
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
Java中没有定期检查的侦听器,除非您自己创建一个。为了安排某件事情在某个特定的时间发生,您通常会通过现在和所需时间之间的时间差来延迟执行。使用Java8的日期/时间API可以很好地做到这一点。如果你想在今天晚上9点触发什么,我建议:
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime ninePMToday = LocalDateTime.now()
.withHour(21)
.withMinute(0)
.withSecond(0)
.withNano(0);
final ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.schedule(() -> System.out.println("It's 9pm!"),
now.until(ninePMToday, ChronoUnit.MILLIS),
TimeUnit.MILLISECONDS);
您还可以通过微调调度程序调用,将其安排为每天晚上9点重复执行:
ses.scheduleAtFixedRate(() -> System.out.println("It's 9pm!"),
now.until(ninePMToday, ChronoUnit.MILLIS),
TimeUnit.DAYS.toMillis(1),
TimeUnit.MILLISECONDS);
更改上面的代码以调整60秒的间隔(有关更多信息,请查看调度程序方法的文档)。在Java中没有定期检查的侦听器,除非您自己做一个。为了安排某件事情在某个特定的时间发生,您通常会通过现在和所需时间之间的时间差来延迟执行。使用Java8的日期/时间API可以很好地做到这一点。如果你想在今天晚上9点触发什么,我建议:
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime ninePMToday = LocalDateTime.now()
.withHour(21)
.withMinute(0)
.withSecond(0)
.withNano(0);
final ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.schedule(() -> System.out.println("It's 9pm!"),
now.until(ninePMToday, ChronoUnit.MILLIS),
TimeUnit.MILLISECONDS);
您还可以通过微调调度程序调用,将其安排为每天晚上9点重复执行:
ses.scheduleAtFixedRate(() -> System.out.println("It's 9pm!"),
now.until(ninePMToday, ChronoUnit.MILLIS),
TimeUnit.DAYS.toMillis(1),
TimeUnit.MILLISECONDS);
更改上面的代码以调整60秒的时间间隔(有关更多信息,请查看调度程序方法的文档)。您是否阅读了此内容:此处已回答此问题:是否阅读了此内容:此处已回答此问题:不知道您被否决的原因。使用像Quartz这样的调度器是一个非常有效的选择,特别是当OP想要有多个作业和不同的调度类型时。不需要重新发明轮子。(然而,你的例子确实不适用于最初要求的“每天晚上9点”时间表)。不知道为什么你会被否决。使用像Quartz这样的调度器是一个非常有效的选择,特别是当OP想要有多个作业和不同的调度类型时。不需要重新发明轮子。(但是,您的示例确实不适用于最初请求的“每天晚上9点”时间表)。或者更简单地说:
LocalTime.now()。直到(LocalTime.of(21,0),毫秒)
;是的,谢谢@assylias!不对。您应该使用ZonedDateTime
而不是LocalDateTime
。Local…
类型没有时区概念,因此无法解释夏令时(DST)等异常情况。或者更简单地说:LocalTime.now()。直到(LocalTime.of(21,0),毫秒)
;是的,谢谢@assylias!不对。您应该使用ZonedDateTime
而不是LocalDateTime
。Local…
类型没有时区概念,因此无法解释夏时制(DST)等异常情况。