Pergunta

Porque eu estou executando uma tarefa crítica vez a cada segundo, eu comparei vários métodos para encontrar a melhor maneira de garantir que a minha tarefa é realmente executado em intervalos de tempo fixos. Depois de calcular o desvio-padrão do erro para todos os métodos, parece que usar os terminais de método scheduledExecutorService.scheduleAtFixedRate() para os melhores resultados, mas eu não tenho a menor idéia por que é assim.

Alguém sabe como esse método funciona internamente? Como o faz, por exemplo, em comparação com um simples sleep() garantir que a tarefa referenciada é realmente executado em intervalos de tempo fixos?

Foi útil?

Solução

A 'normal' Java VM não pode fazer quaisquer garantias de tempo real sobre os tempos de execução (e, como consequência disso também sobre os tempos de agendamento). Se você realmente precisa rígidos garantias em tempo real, você deve ter um olhar para um tempo real VM como Java RTS . Claro que você precisa de um sistema operacional em tempo real, nesse caso também.

No que diz respeito comparação com Thread.sleep (): a vantagem de scheduledExecutorService.scheduleAtFixedRate (), em comparação a um uso (ingênuo) de Thread.sleep () é que ele não é afetado pelo tempo de execução da tarefa agendada. Veja ScheduledFutureTask.runPeriodic () sobre a forma como isso é implementado.

Outras dicas

Você pode ter um olhar da implementação OpenJDK7 de ScheduledThreadPoolExecutor.java que é a única classe que implementa a interface ScheduledExecutorService.

No entanto, tanto quanto eu sei que não há garantia no ScheduledExecutorService sobre a precisão. Assim, mesmo se os seus measurments mostrar que este seja acurate que pode não ser o caso se você mudar para uma plataforma diferente, vm ou jdk.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top