Como faço para fazer um atraso em Java?

estou a tentar fazer algo em Java e preciso de algo para esperar / atrasar por uma quantidade de segundos num ciclo while.

while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

    // I need to wait here

    ceva[i].setSelected(false);

    // I need to wait here

    i++;
}
Quero construir um sequenciador de passos e sou novo em Java. Alguma sugestão?

 190
Author: Peter Mortensen, 2014-06-08

4 answers

Se quiser parar, use java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Dormir por um segundo ou

TimeUnit.MINUTES.sleep(1);

Dormir um minuto.

Como isto é um laço, isto apresenta um problema inerente - a deriva. Cada vez que você executar o código e, em seguida, dormir você estará se afastando um pouco de correr, digamos, a cada segundo. Se este é um problema, então não use sleep. Além disso, não é muito flexível quando se trata de controlar. Por executar uma tarefa a cada segundo ou a uma segundo atraso, eu recomendaria ScheduledExecutorService e quer scheduleAtFixedRate ou scheduleWithFixedDelay.

Por exemplo, para executar o método myTask a cada segundo (Java 8):

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

E em Java 7:

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            myTask();
        }
    }, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}
 409
Author: Boris the Spider, 2016-08-09 19:46:11

Uso Thread.sleep(1000);

1000 é o número de milissegundos que o programa vai parar.

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}
 93
Author: Ann Ragg, 2018-08-19 16:57:40

Tens de usar a chamada Thread.sleep().

Mais informação aqui: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

 5
Author: Ruslan, 2014-06-08 08:34:31

A utilização de TimeUnit.SECONDS.sleep(1); ou Thread.sleep(1000); é uma forma aceitável de o fazer. Em ambos os casos você tem que pegar InterruptedException o que torna o seu código volumoso.Existe uma biblioteca java de código aberto chamada MgntUtils (escrito por mim) que fornece um utilitário que já lida com InterruptedException dentro. Então o seu código incluiria apenas uma linha:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Veja o javadoc aqui. Você pode acessar a biblioteca de Maven Central ou de Github. O artigo que explica a biblioteca pode ser encontrado Aqui.

 1
Author: Michael Gantman, 2018-08-19 18:23:33