Thread.sleep()  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
cassio
GUJ Master
[Avatar]

Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline

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() ?!

Cássio Marques

Blog
spyrogyra
JavaChild

Membro desde: 22/10/2004 04:20:27
Mensagens: 147
Offline

Talvez resolva

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

[]´s
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

É claro que sim.

Thread 1:

Thread 2:


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".
[WWW]
SkYr0x
What is classpath?
[Avatar]

Membro desde: 29/05/2006 10:20:52
Mensagens: 6
Offline

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

[]s
[MSN]
Rafael Nunes
Moderador
[Avatar]

Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline

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

------------------------------------------------------------------
"Think different? I'd be happy if most people would just think..."

http://www.yaw.com.br
http://twitter.com/rafanunes
http://twitter.com/youandwe
[Email]
cassio
GUJ Master
[Avatar]

Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline

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

Obrigado a todos que responderam

Cássio Marques

Blog
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.

[WWW]
muldon
JavaTeenager
[Avatar]

Membro desde: 16/05/2006 14:06:03
Mensagens: 174
Offline

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 !

Sun Certified Java Programmer 5
rmarin
JavaEvangelist
[Avatar]

Membro desde: 13/07/2005 09:14:45
Mensagens: 360
Localização: São Paulo
Offline

muldon wrote: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.

Roberto Marin
__________________________________________
Odeio auto-nerds!
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

rmarin wrote:
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.


É isso aí. 5 estrelas



[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

rmarin wrote: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.


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).


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team