如何使用Java在特定时间触发方法?

时间:2016-10-25 09:59:56

标签: java time

我希望我的程序在晚上9点之前调用方法。

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

如果没有,我如何让程序每隔60秒调用一次方法?

非常感谢< 3

2 个答案:

答案 0 :(得分:2)

除非您自己制作,否则没有定期用Java检查的监听器。要安排在特定时间发生的事情,通常会延迟执行时间与现在时间之间的差异。你可以用Java 8的日期/时间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秒间隔(有关详细信息,请查看调度程序方法的文档)。

答案 1 :(得分:1)

您必须使用任何调度程序。我建议使用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);