Em programas Java, há situações em que um thread está executando muito rápido ou o programa precisa alternar para outro thread. Para fazer isso, você precisa suspender a execução do thread atual. Em Java, isso pode ser feito usando o método java.lang.Thread.sleep() .
Método Thread.sleep()
A classe Thread está presente no pacote Java.lang e contém o método Thread.sleep() . O método Java.lang.thread sleep() é usado para suspender o thread atual por um período de tempo especificado em milissegundos. Se você examinar os documentos do Oracle , descobrirá que há dois métodos sleep() sobrecarregados da classe Thread .
static void sleep(long millis)
onde milis é o tempo em milissegundos. Esse método faz com que o thread atualmente em execução entre em suspensão (interrompa temporariamente a execução, “dormindo”) por milissegundos, dependendo da precisão dos cronômetros e agendadores do sistema. O valor do argumento para milissegundos não pode ser negativo. Nesse caso, o IllegalArgumentException será lançado.
static void sleep(long millis, int nanos)
onde mills é o tempo em milissegundos e nanos é o tempo em nanossegundos. Essa variante do método é usada para suspender a execução do thread atual pelo tempo exato em milissegundos e nanossegundos. O valor de nanossegundos é válido entre 0 e 999999. Vamos criar um programa simples que usa o método Thread.sleep() para pausar a execução da thread principal por 5 segundos:
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
}
}
O que está acontecendo neste programa? Primeiro ele inicia, depois fica inativo por 5 milissegundos (5 segundos), depois imprime no console uma mensagem sobre quanto tempo ficou congelado e, em seguida, sai. A saída é:
O thread é pausado por 5008 milissegundos
Como você pode ver, o programa não parou por 5 segundos, mas um pouco mais. Além disso, se você executar o programa em seu computador, notará que ele pode interromper a execução do thread por mais de 5.000 milissegundos e não é necessário por 5.008 milissegundos. A questão é que tudo depende do sistema operacional e da implementação específica do agendador de threads. Com um pouco mais de detalhes, o tempo real que um thread espera antes de acordar e iniciar a execução depende dos cronômetros e agendadores do sistema. Para um sistema silencioso, o tempo de inatividade real é próximo ao tempo de inatividade especificado, mas para um sistema carregado será um pouco mais longo. Esse método geralmente é usado em threads filhos quando você precisa executar alguma ação o tempo todo, mas não com muita frequência. Aqui está um exemplo de um programa que imprimirá uma mensagem a cada segundo e nunca sairá:
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
while (true)
{
Thread.sleep(1000);
System.out.println("One more second");
}
}
}
Pontos importantes do Java Thread Sleep
É importante lembrar que o método Java Thread Sleep funciona de forma que:-
Ele sempre suspende a execução do thread atual.
-
O encadeamento real dorme até acordar e o tempo de execução depende dos cronômetros e agendadores do sistema.
-
O thread adormecido não bloqueia o thread atual.
-
Qualquer outro thread pode interromper o thread adormecido atual, caso em que uma InterruptedException é lançada.
-
O valor do argumento para milissegundos não pode ser negativo, caso contrário, um IllegalArgumentException será lançado.
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(-5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
}
}
Aqui está a saída:
Exceção no thread "main" java.lang.IllegalArgumentException: o valor do tempo limite é negativo em java.base/java.lang.Thread.sleep(Native Method) em SleepDemo.main(SleepDemo.java:7)
Acima, colocamos o fio principal para dormir. Agora vamos tentar aplicar o método a algum outro thread.
// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{
public void run()
{
// thread 0
try {
for (int i = 0; i < 10; i++) {
// sleeps the main thread for about 2 seconds
Thread.sleep(2000);
System.out.println(i);
}
}
catch (Exception e) {
// catching the exception
System.out.println(e);
}
}
public static void main(String[] args)
{
SleepDemo2 sleepDemo2 = new SleepDemo2();
sleepDemo2.start();
}
}
A saída é:
0 1 2 3 4 5 6 7 8 9
GO TO FULL VERSION