Thread.sleep()

Olá pessoal,

Tenho a seguinte dúvida:

uma thread colocada para dormir pode ser acordada antes de decorrido o tempo passado para o método sleep() ?!

Talvez resolva :wink:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#start()

[]´s

É claro que sim.

private Thread thr1;

Thread 1:

thr1 = Thread.currentThread();
try { Thread.sleep(10000); } catch (InterruptedException ex) {
    System.out.println ("Puxa, estava dormindo! Você me acordou");
}

Thread 2:

    thr1.interrupt();

Atenção:
a) Ctrl+C ou Ctrl+Break não geram uma “InterruptedException”. Só “Thread.interrupt” é que gera a tal interrupção.
b) Parar uma cópia de arquivos com Thread.interrupt não funciona bem no Windows, já que no Windows não há o equivalente do Unix para o “signal”.

Eu acho que é só dar um notify() nela, assim como quando se usa o Thread.wait().

[]s

Quando você chama Thread.sleep(x), a JVM informa o sistema operacional para não mais atender esta Thread pelo tempo indicado.
Uma tentativa é chamar sleep() com um período menor do que foi informado, mas não sei se ainda assim funcionaria.

[edit]Ps:Thingol pra variar foi mais rápido e respondeu como se faz…hehe

Quer dizer então que a única maneira de acordar antecipadamente uma thread é causando uma InterruptedException?!

Obrigado a todos que responderam :slight_smile:

O seu problema, como de costume, pode ser resolvido de formas diferentes.

Uma delas é “dormir com um olho aberto”.
Por exemplo, em vez de dormir 10 segundos, você pode dormir 10 vezes 1 segundo.
Entre cada intervalo, você chama algum método que indica se você deve acordar antes.
Não use um intervalo pequeno demais (como um milissegundo); isso vai puxar CPU demais. Use pelo menos 10 milissegundos.

    Eai amigo blz ?
    Olha , seguinte, quando se trata de Threads, nada podemos garantir sobre o tempo ! ( referencia do Livro da Katty Sierra ). Ou seja, o fato de uma thread dormir 4 seg , nao significa q ela ira acordar logo apos isso e voltar ao estado runnig( Consulta os estados das threads ). Para vc acordar uma thread vc usa o notify. Mas se a thread que esta aguardando a liberacao do lock de um objeto receber um notify, ela tb sera candidata a voltar a processamento, mas nao é garantido q ira voltar imediatamente. Ou seja, nao é garantido que ela voltara ao processamento antes do tempo do sleep, pois isso depende de varios fatores, tais como a JVM local de cada maquina. Bom , espero ter ajudado, abraco !

Pessoal, para trazer uma Thread para o estado “Rodável” - runnable - sendo que ela está dormindo, só mesmo chamando o método interrupt() da Thread que deseja acordar. O notify só serve quando a Thread está em estado wait, caso contrário a Thread continuará dormindo.

Se você quer dormir por um tempo determinado ou até que a Thread seja notificada, utilize o método sobrecarregado wait(long milliseconds), deste modo a Thread espera ser notificada até o tempó limite, caso contrário entra em execução.

[quote=rmarin]
Se você quer dormir por um tempo determinado ou até que a Thread seja notificada, utilize o método sobrecarregado wait(long milliseconds), deste modo a Thread espera ser notificada até o tempó limite, caso contrário entra em execução.[/quote]

É isso aí. 5 estrelas

Só cuidado com pois existem duas pegadinhas.
a) Wait(0) faz a thread dormir para sempre;
b) A thread pode acordar antes do tempo estabelecido e antes do notify. Isso é chamado de spurious wakeup. Por isso, é bom colocar waits dentro de um bloco while, que garantam que a condição de saída foi satisfeita. No caso da condição ser só um timeout, fique atento ao que citei no item a (já que o cálculo do timeout pode retornar 0).

sei que o tópico é antigo mas vou passar um trecho do livro da querida Kathy, o SCJP:

“Quando um thread encontra uma chamada de suspensão, terá que ficar suspenso pelo menos durante o período especificado em milissegundos (a menos que seja interrompido antes de sua hora de despertar, caso em que lançará imediatamente a exceção InterruptedException).”