Thread.sleep()

Tenho uma pequena rotina que dentro de um While que executa aproximadamente 4.000 voltas, atualizo um object jTextField. Acontece que a atualização não é apresentada na tela. Então eu busquei na net um comando que faça a função do DoEvents do Visual Basic, encontrei um método Thread.sleep() mas não consegui fazer funcionar. Alguem sabe como resolver isso?

Agradeço Antecipadamente,

Eduardo Melo
www.eduardomelo.eti.br

Thread.sleep(1000)
é pra fazer seu programa durmir tantos milisegundos…
no exemplo acima vai ficar parado por 1 segundo ;D

O método Thread.sleep() faz uma thread (e não o programa todo) dormir, e permite que outras threads executem enquanto isso.

Entretanto, fique atento para o seguinte:

  1. Se o seu método está dentro de um evento de botão, ele estará também rodando na thread da AWT. Essa é a mesma thread que faz a pintura do componente. Portanto, alterar diversas vezes o valor do componente, ou colocar essa thread para dormir, não resolverá o problema, uma vez que a atualização em si só ocorrerá após a execução do seu método.

  2. Mesmo rodando em outra Thread, a AWT é autorizada a fazer “event coalescing”, ou seja, se várias ações de repaint são encaminhadas ao mesmo tempo, ela pode ignorar todas e executar apenas algumas. A explicação disso é simples. Não adianta atualizar mais rápido do que o olho pode ver. É preferível então agrupar esses eventos e gerar um aplicativo com mais performance e menos flicking.

  3. A solução para seu problema é rodar o código em outra thread, e pedindo para essa outra thread empilhar eventos na AWT. Como você fará muitas atualizações, cabe dar um pequeno sleep() nessa outra thread, para que a AWT processe o repaint().

Não sei exatamente para quê você quer fazer isso. Dependendo da razão, pode haver uma solução melhor que essa.

Para ver como rodar a thread separada e empilhar eventos na AWT, por favor consulte o seguinte post:
http://www.guj.com.br/posts/list/52022.java#273868

Não existe um equivalente ao “DoEvents” do VB. Se puser um Thread.sleep a sua thread vai simplesmente dormir, não redesenhar a tela.

A rotina de atualização do seu JTextField deve ser colocada em uma Thread diferente daquela da aplicação. Você pode fazer isso com uma classe que implemente Runnable, daí no método run() você deve colocar o seu While e o Thread.sleep() ou usar um TimerTask, onde não será necessário nem do While, bastando agendá-lo para o intervalo de tempo que você colocaria no sleep.