在指定时间内安排Java任务

时间:2011-11-09 14:03:25

标签: java scheduled-tasks runnable executor

我希望能够在Java中的特定时间安排任务。我理解ExecutorService能够定期安排,并在指定的延迟后安排,但我看的时间比一段时间更长,而不是持续时间。

有没有办法在2:00执行Runnable执行,或者我是否需要计算从现在到2:00之间的时间,然后安排runnable在延迟后执行?

6 个答案:

答案 0 :(得分:5)

你也可以使用弹簧注释

@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

答案 1 :(得分:4)

这就是我用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);

它恰好比我想象的要复杂得多

答案 2 :(得分:3)

你会想要Quartz

答案 3 :(得分:2)

今天早上我自己处理了这种情况......这是我在午夜运行的代码

    scheduler = Executors.newScheduledThreadPool(1);
    Long midnight=LocalDateTime.now().until(LocalDate.now().plusDays(1).atStartOfDay(), ChronoUnit.MINUTES);
    scheduler.scheduleAtFixedRate(this, midnight, 1440,  TimeUnit.MINUTES);

答案 4 :(得分:0)

结帐Quartz。我们将它用于我们的生产应用程序,它非常好。它的工作方式与crontab非常相似。您可以在设定的时间表中指定时间,并在那时执行回调。

答案 5 :(得分:0)

用户java.util.Timer。它有方法new schedule(task, time),其中time是您想要执行一次任务的日期。