Как метод ScheduleExecutorService.scheduleAtFixedRate() обеспечивает выполнение в реальном времени?

StackOverflow https://stackoverflow.com/questions/1513518

Вопрос

Поскольку я выполняю критическую по времени задачу каждую секунду, я сравнил несколько методов, чтобы найти лучший способ гарантировать, что моя задача действительно выполняется с фиксированными временными интервалами.После расчета стандартного вывода ошибки для всех методов похоже на использование метода scheduledExecutorService.scheduleAtFixedRate() приводит к лучшим результатам, но я понятия не имею, почему это так.

Кто-нибудь знает, как этот метод работает внутри?Как это, например, по сравнению с простым sleep() гарантировать, что указанная задача действительно выполняется с фиксированными временными интервалами?

Это было полезно?

Решение

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

Что касается сравнения с Thread.sleep():Преимущество запланированногоExecutorService.scheduleAtFixedRate() по сравнению с (простым) использованием Thread.sleep() заключается в том, что на него не влияет время выполнения запланированной задачи.См. ScheduledFutureTask.runPeriodic() о том, как это реализовано.

Другие советы

Вы можете посмотреть реализацию OpenJDK7 ScheduledThreadPoolExecutor.java это единственный класс, реализующий интерфейс ScheduledExecutorService.

Однако, насколько мне известно, в ScheduledExecutorService есть гарантия точности.Таким образом, даже если ваши измерения показывают, что это точно, это может быть не так, если вы переключитесь на другую платформу, vm или jdk.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top