Запланируйте задачу Java на указанное время - PullRequest
5 голосов
/ 09 ноября 2011

Я хотел бы иметь возможность планировать задачу в определенное время на Java.Я понимаю, что ExecutorService имеет возможность планировать с периодическими интервалами и после указанной задержки, но я больше смотрю на время суток, а не на более длительные.

Есть ли способскажем, Runnable выполнить в 2:00 или мне нужно рассчитать время между настоящим моментом и 2:00, а затем запланировать выполнение runnable после этой задержки?

Ответы [ 6 ]

5 голосов
/ 09 ноября 2011

Вы также можете использовать весенние аннотации

@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

4 голосов
/ 07 сентября 2012

Вот как я решил это с помощью 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);

это оказывается сложнее, чем я думал, чтобы сделать это правильно

3 голосов
/ 09 ноября 2011

Вам понадобится Кварц .

2 голосов
/ 04 августа 2014

Я попал в эту ситуацию сегодня утром ... Это был мой код для запуска в полночь

    scheduler = Executors.newScheduledThreadPool(1);
    Long midnight=LocalDateTime.now().until(LocalDate.now().plusDays(1).atStartOfDay(), ChronoUnit.MINUTES);
    scheduler.scheduleAtFixedRate(this, midnight, 1440,  TimeUnit.MINUTES);
0 голосов
/ 09 ноября 2011

пользователь java.util.Timer.У него есть метод new schedule(task, time), где time - это дата, когда вы хотите выполнить задачу один раз.

0 голосов
/ 09 ноября 2011

Выезд Кварц .Мы используем его для наших производственных приложений, и это очень хорошо.Это работает почти как crontab.Вы можете указать время в течение установленного расписания, и оно будет выполнять обратный вызов в это время.

...