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?
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 usesleep
.
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");
}
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();
}
Tens de usar a chamada Thread.sleep()
.
Mais informação aqui: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
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.