Question

Parce que je suis l'exécution d'une tâche critique du temps à chaque seconde, je comparais plusieurs méthodes pour trouver la meilleure façon de faire en sorte que ma tâche soit réellement exécutée dans les étapes de temps fixes. Après avoir calculé la dérivation standard de l'erreur pour toutes les méthodes, il semble que la méthode scheduledExecutorService.scheduleAtFixedRate() conduit aux meilleurs résultats, mais je n'ai pas la moindre idée pourquoi il en est ainsi.

Quelqu'un sait-il comment cette méthode fonctionne en interne? Comment ça fait par exemple par rapport à un simple sleep() veiller à ce que la tâche référencée soit réellement exécutée dans les étapes de temps fixes?

Était-ce utile?

La solution

Une « normale » la machine virtuelle Java ne peut faire aucune garantie en temps réel difficiles sur les temps d'exécution (et en conséquence de cela aussi sur les délais de planification). Si vous avez vraiment besoin de temps réel dur garantit que vous devriez jeter un oeil à une machine virtuelle en temps réel comme Java RTS . Bien sûr, vous avez besoin d'un système d'exploitation en temps réel dans ce cas aussi.

En ce qui concerne la comparaison à Thread.sleep (): l'avantage de scheduledExecutorService.scheduleAtFixedRate () par rapport à une utilisation (naïve) de Thread.sleep () est qu'il ne soit pas affectée par le temps d'exécution de la tâche planifiée. Voir ScheduledFutureTask.runPeriodic () sur la façon dont cela est mis en œuvre.

Autres conseils

Vous pouvez avoir un regard de la mise en œuvre de OpenJDK7 ScheduledThreadPoolExecutor.java qui est la seule classe qui implémente l'interface ScheduledExecutorService.

Mais pour autant que je sais qu'il est garantie dans le ScheduledExecutorService portant sur la précision. Donc, même si vos measurments montrent que ce soit acurate qui ne peut être le cas si vous passez à une autre plate-forme, vm ou jdk.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top