Каким образом метод scheduleExecutorService.scheduleAtFixedRate () обеспечивает выполнение в реальном времени? - PullRequest
1 голос
/ 03 октября 2009

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

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

Ответы [ 2 ]

4 голосов
/ 03 октября 2009

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

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

1 голос
/ 03 октября 2009

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

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

...