2013-12-04 1 views
0

Я использую SchedulerExecuterService для выполнения задачи после указанной задержки и с заданными интервалами.scheduleAtFixedRate не запускать задачу при указанной задержке

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(taskThread,60 ,120 ,TimeUnit.SECONDS); 

Что происходит в первый раз taskThread не запускается после задержки 60 сек, он запускается после задержки более чем на 60 секунд. В то время как следующие казни начинались с правильных интервалов в 120 секунд (не ровно 120 секунд, но есть очень минутная задержка, которую можно игнорировать).

Мой запрос - почему первое исполнение задерживается более 60 секунд? Поскольку задача выполняется потоком, зависит ли время запуска от приоритета потока?

Как я могу запустить его при точной задержке в 60 секунд? Как насчет библиотеки кварца? Будет ли эта библиотека решает мою задачу (запустите работу в определенное время без каких-либо задержек)?

Заранее спасибо.

ответ

0

Запуск задания зависит от запланированного времени и количества доступных потоков - если их нет, его можно отложить. Однако дальнейшие казни начнутся в запланированное время (delay + n * period) - что происходит в вашем случае.

Начало будет происходить примерно в запланированное время, я сомневаюсь, что в этом существуют гарантии в реальном времени, это зависит от базовой ОС. Вы можете попробовать изменить приоритет потока для потока в этом пуле потоков. Это может помочь, но это не даст вам гарантии, что это будет работать в разных условиях.

Вы также можете убедиться, что вы запускаете одну задачу для фиксированного пула потоков из одного потока, который вы используете. Или попробуйте увеличить количество потоков.

+0

Что относительно библиотеки кварца? Возможно ли это? – Infotechie

+0

Не связывайтесь с приоритетом потока в JVM, это обычно ухудшает ситуацию. Что касается гарантий в реальном времени, то обычные JVM не работают, но есть специальные JVM, которые делают (но вы не хотите их использовать). –

0

T.b.h. задержка, которую вы видите, вряд ли будет ошибкой ScheduledExecutorService. Запуск нити не займет секунды, если ваша машина не будет смешно перегружена, и я думаю, что поток будет инициализирован заранее, если вы используете пул потоков фиксированного размера.

Я предполагаю, что это инициализация ваших собственных задач. Я не знаю, что вы делаете в своей задаче, но получение ресурсов (пулов пулов БД) и т. Д. Может составлять значительное время.

Если вы хотите, вы можете протестировать с помощью тривиальной задачи (например, написать «привет» на консоли). И тогда вы можете измерить каждую часть своей задачи, чтобы увидеть, что занимает много времени. Как только у вас есть это, вы можете подумать о том, как «согреть» вашу систему, чтобы предотвратить задержку.

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

  • Нет связанных вопросов^_^