Como atrasar a execução de código em Java

Como atrasar a execução de código em Java

1. Introdução

É relativamente comum os programas Java adicionarem um atraso ou uma pausa em sua operação. Isso pode ser útil para o andamento da tarefa ou para pausar a execução até que outra tarefa seja concluída.

Este tutorial descreve duas maneiras de implementar atrasos em Java.

2. Uma abordagem baseada emThread

When a Java program runs, it spawns a process que é executado na máquina host. This process contains at least one thread – the main thread - no qual o programa é executado. Além disso, o Java ativamultithreading, que permite aos aplicativos criar novos encadeamentos que são executados em paralelo ou de forma assíncrona com o encadeamento principal.

2.1. UsandoThread.sleep

Uma maneira rápida e suja de fazer uma pausa no Java é dizer ao encadeamento atual para dormir por um período de tempo especificado. Isso pode ser feito usandoThread.sleep(milliseconds):

try {
    Thread.sleep(secondsToSleep * 1000);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

It is good practice to wrap the sleep method in a try/catch block in case another thread interrupts the sleeping thread. Nesse caso, capturamosInterruptedExceptione interrompemos explicitamente a thread atual, para que possa ser capturada posteriormente e tratada. Isso é mais importante em um programa com vários threads, mas ainda é uma boa prática em um programa de thread único, caso possamos adicionar outros threads posteriormente.

2.2. UsandoTimeUnit.sleep

For better readability, we can use TimeUnit.XXX.sleep(y), where XXX is the time unit to sleep for (SECONDSMINUTES, etc.), and y is the number of that unit to sleep for. Isso usaThread.sleep nos bastidores. Aqui está um exemplo da sintaxeTimeUnit:

try {
    TimeUnit.SECONDS.sleep(secondsToSleep);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

No entanto,there are some disadvantages to using these thread-based methods:

  • Os tempos de suspensão não são exatamente precisos, especialmente ao usar incrementos menores, como milissegundos e nanossegundos

  • Quando usado dentro de loops, o sono varia um pouco entre as iterações do loop devido a outras execuções de código, portanto o tempo de execução pode ficar impreciso após várias iterações

3. Uma abordagem baseada emExecutorService

Java fornece a interfaceScheduledExecutorService, que é uma solução mais robusta e precisa. Essa interface pode agendar código para execução uma vez após um atraso especificado ou em intervalos de tempo fixos.

Para executar um trecho de código uma vez após um atraso, podemos usar o métodoschedule:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

A parteClassname::someTask é onde especificamos o método que será executado após o atraso:

  • someTask é o nome do método que queremos executar

  • Classname é o nome da classe que contém o métodosomeTask

Para executar uma tarefa em intervalos de tempo fixos, podemos usar o métodoscheduleAtFixedRate:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Isso irá chamar repetidamente o métodosomeTask, pausando pordelayInSeconds entre cada chamada.

Além de permitir mais opções de temporização, o métodoScheduledExecutorService rende intervalos de tempo mais precisos, pois evita problemas com drift.

4. Conclusão

Neste artigo, discutimos dois métodos para criar atrasos nos programas Java.

O código completo deste artigo pode ser encontradoover on Github. Este é um projeto baseado em Maven, portanto, deve ser fácil importar e executar como está.