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

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

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


person Markus    schedule 03.10.2009    source источник


Ответы (2)


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

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

person Kutzi    schedule 03.10.2009

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

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

person Wolfgang    schedule 03.10.2009
comment
Поскольку класс очень часто внутри использует другие классы, мне очень трудно следить за ним. Но я думаю, что это может иметь значение: я обнаружил, что задачи помещаются в PriorityQueue, которая, вероятно, сортирует задачи по их приоритету, что означает их ожидаемое время выполнения. Поэтому кажется, что на самом деле нет никакой гарантии в реальном времени. Но чем этот подход лучше, чем sleep(rate)? Может быть, очередь может запускать потоки с более высоким приоритетом, чем, например, сборщик мусора, чтобы иметь возможность выполнять задачу почти в режиме реального времени? - person Markus; 03.10.2009
comment
Вы имеете в виду, насколько я знаю, нет гарантии? - person Michael Easter; 17.01.2012