2015-04-08 3 views
0

Я использую следующий код, чтобы запланировать таймер (java.util.Timer):JAVA Что произойдет, если я планирую ежедневную ежедневную ежедневную работу в 12:00 после 12:00?

Timer mytimer = new Timer("My Timer"); 
Calendar c = Calendar.getInstance(); 
c.set(Calendar.HOUR_OF_DAY, 12); 
mytimer.schedule(mytask, c.getTime(), 24*60*60*1000); 

Я хочу, чтобы задание таймера для запуска каждый день в 12:00. Мой вопрос в том, что произойдет, если приложение работает ПОСЛЕ 12:00. Скажем, 16:00. Будет ли задание таймера работать на следующий день в 12:00?

ответ

2

Документация Таймер класс гласит о методе public void schedule(TimerTask task, Date firstTime, long period)

В исполнении с фиксированной задержкой, каждое выполнение запланированные по отношению к фактическому времени выполнения предыдущего выполнения. Если исполнение по какой-либо причине задерживается (например, сбор мусора или другая фоновая активность), последующие казни также будут отложены. В конечном счете частота выполнения обычно будет немного ниже, чем обратная величина указанного периода (при условии, что системные часы, лежащие в основе Object.wait (long), точны). В результате вышесказанного , если запланированный первый раз в прошлом, он запланирован для немедленного выполнения.

Таким образом, из вышеизложенного можно понять, что задача будет немедленно запланирована и выполнена, а после этого в соответствии с вашей программой будет выполнено 24 часа спустя. Поэтому, если это 16:00, он будет выполнен немедленно и снова будет выполнен в 16:00 следующего дня.

+0

Спасибо! Наверное, я пропустил это! –

+0

Есть ли способ избежать этого? Я назначил одну работу, которая запускается только один раз в день, для отправки оповещений в команде. Проблема в том, что иногда мне приходится перезапускать приложение для развертывания, в этом случае команда получает уведомления несколько раз в день. Я не хочу этого. Не могли бы вы помочь – theGamblerRises

+0

@theGamblerRises, почему бы вам не задать свой вопрос в качестве нового вопроса, дающего детали проблемы и сценарий возникновения проблемы. Тогда мы могли бы помочь вам с тем же. Вопрос в комментарии не очень полезен. – Blip

1

Вы могли бы рассмотреть вопрос об использовании ScheduledThreadPoolExecutor как

Это фактически является более универсальной заменой для таймера/TimerTask сочетание (link)

Кроме того, Java 8 предоставляет некоторые полезные инструменты, чтобы сделать требуемые расчеты времени. Примером может служить:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

public void schedule(Runnable command) { 
    LocalDateTime currentTime = LocalDateTime.now(); 

    LocalDateTime executionDate = LocalDateTime.of(currentTime.getYear(), 
                currentTime.getMonth(), 
                currentTime.getDayOfMonth(), 
                12, 0); // begin execution at 12:00 AM 

    long initialDelay; 

    if(currentTime.isAfter(executionDate)){ 
     // take the next day, if we passed the execution date 
     initialDelay = currentTime.until(executionDate.plusDays(1), ChronoUnit.MILLIS); 
    } else { 
     initialDelay = currentTime.until(executionDate, ChronoUnit.MILLIS); 
    } 

    long delay = TimeUnit.HOURS.toMillis(24); // repeat after 24 hours 

    ScheduledFuture<?> x = scheduler.scheduleWithFixedDelay(command, initialDelay, delay , TimeUnit.MILLISECONDS); 
} 
+0

Я не могу использовать Java 8, поэтому, к сожалению, это не решение для меня. –

Смежные вопросы