Qual é a principal diferença entre scheduleAtFixedRate
e scheduleWithFixedDelay
métodos de ScheduledExecutorService ?
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("scheduleAtFixedRate: " + new Date());
}
}, 1, 3L , SECONDS);
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("scheduleWithFixedDelay: " + new Date());
}
}, 1, 3L , SECONDS);
eles imprimem exatamente ao mesmo tempo, parece que são executados exatamente no mesmo intervalo.
java
scheduled-tasks
scheduledexecutorservice
Serrador
fonte
fonte
Visualize séries temporais do
scheduleAtFixedRate
método de invocação . As próximas execuções começarão imediatamente se a última demorar mais do que o período. Caso contrário, ele começará após o período.Séries temporais do
scheduleWithFixedDelay
método de invocação . A próxima execução começará após o tempo de atraso entre o término de uma execução e o início da próxima, independentemente do seu tempo de execuçãoEspero poder te ajudar
fonte
O
scheduleAtFixedRate()
método cria uma nova tarefa e a envia ao executor a cada período, independentemente de a tarefa anterior ter sido concluída ou não .Por outro lado, o
scheduleWithFixedDelay()
método cria uma nova tarefa após o término da tarefa anterior .fonte
scheduleAtFixedRate
:)Se você ler o Java Doc, será mais claro
ScheduledFuture scheduleAtFixedRate (comando Runnable, long initialDelay, longo período, unidade TimeUnit) Cria e executa uma ação periódica que é habilitada primeiro após o atraso inicial fornecido e, subsequentemente, com o período determinado; isto é, as execuções começarão após initialDelay, initialDelay + período, initialDelay + 2 * período e assim por diante.
ScheduledFuture scheduleWithFixedDelay (comando Runnable, long initialDelay, long delay, unidade TimeUnit) Cria e executa uma ação periódica que se torna habilitada primeiro após o determinado atraso inicial e, subsequentemente, com o determinado atraso entre o término de uma execução e o início da próxima.
fonte
Existe um problema em scheduleAtFixedRate se o primeiro thread está demorando muito e não terminou com a duração dada então o segundo thread consciencial não iniciará uma vez que a primeira tarefa será concluída e não será iniciada imediatamente enquanto o primeiro thread terminar sua tarefa e receber a duração foi decorrido. JVM decidirá quando a próxima tarefa será executada.
Acho que vai te ajudar a escolher o método Porque devido a isso eu tenho um grande problema
fonte
ScheduledThreadPoolExecutor
(e este último tem um comportamento bem definido)Vamos escrever um programa simples:
E veja os resultados:
AVISO o tempo de execução é maior do que a espera
scheduleWithFixedDelay mantém atraso
scheduleAtFixedRate remove atraso
fonte
Basta executá-lo e você saberá a diferença. Obrigado
fonte