Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java在特定时间启动方法?_Java_Time - Fatal编程技术网

如何使用Java在特定时间启动方法?

如何使用Java在特定时间启动方法?,java,time,Java,Time,我希望我的程序在晚上9点时调用一个方法 那么,是否有一个侦听器可以在某个时间连续检查并触发一个方法 如果不是,我如何让程序每60秒调用一个方法 非常感谢您必须使用任何调度程序。我建议使用QuartzJob。您将需要: class MyJob implements Job { public void execute (JobExecutionContext ctx) { } } CronTrigger: CronTrigger trigger = new CronTrigger

我希望我的程序在晚上9点时调用一个方法

那么,是否有一个侦听器可以在某个时间连续检查并触发一个方法

如果不是,我如何让程序每60秒调用一个方法


非常感谢您必须使用任何调度程序。我建议使用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)等异常情况。