Delay no java

como faço para fazer um delay no java, preciso dar um tempo no programa

Se vc quiser 1 segundo, por exemplo, crie uma thread e dê um sleep nela

Thread.sleep(1000);

Voce nao precisa necessariamente criar uma thread nova pra dar sleep - a main() tambem roda em uma Thread, ou seja, todo codigo Java ja esta rodando em uma Thread, mesmo que voce nao tenha explicitamente criado uma :wink:

O exemplo completo é:

try { Thread.sleep (1000); } catch (InterruptedException ex) {}

Ponha esta linha onde quiser dar uma pausa de 1 segundo, ou encapsule-a em uma rotina.

Opa opa opa

Cuidado la:

  1. O metodo sleep da classe Thread eh estatico e faz a thread atual dormir o tempo indicado em milisegundos. Cuidado pois se voce recebe uma thread poir exemplo:

void a(Thread t) {
t.sleep(1000);
}

A sua thread ATUAL ira dormir, e nao a thread t

  1. Jamais coloque um bloco try/catch sem nada dentro, no minimo coloque o printstacktrace!

Att

No caso de uma InterruptedException eu nao acho que seja tao importante assim tratar a excecao… em muitos casos ela nao quer dizer muita coisa mesmo, e nao ha muito o que fazer a nao ser sair do bloco try/catch silenciosamente.

Eh a unica exception que nao eh caso excepcional que eu conheco :?

Se realmente você quer fazer algo que durma 1 segundo ou um pouco mais, pode-se fazer algo como pegar o horário atual (System.currentTimeMillis()), usar o Thread.sleep,

P.S. - bom, o que eu tinha escrito aqui? Vou tentar lembrar -

e ver se realmente dormiu 1 segundo. Se faltou dormir (porque recebeu uma InterruptedException), tentar dormir o tempo que falta - isso deve ficar preferencialmente em um loop. Parece coisa de quem precisa dormir exatamente 8 horas com uma criança chorando a seu lado. Você acaba acordando a toda hora, vendo o horário, e tentando dormir mais um pouco até chegar a hora de acordar.

Se quer algo menos incômodo pode usar Timer (java.util.Timer) e dormir o tempo certo.

Hmmm. Pessoalmente, acho perigoso.

public class Teste1 {

	public static void main(String[] args) {
		Thread t1 = new Thread() {
			public void run() {
				System.out.println("Sleeping");
				try {
					Thread.sleep(60000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("dormi 60 segundos?");
			}
		};
		t1.start();
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t1.interrupt();
	}

}

Repare que o codigo acima starta uma thread que deveria dormir no 60 segundos, mas alguem a interrompe e ela dorme MENOS de 60 segundos.

Portanto, aqueles que precisam da certeza que dormiram no minimo X segundos, precisam conhecer exatamente o que o interrupted exception fez com sua thread. Muita gente simplesmente ignora pq todo mundo ignora, e nao sabe que sua thread pode acordar antes… perigoso…

[quote=thingol]Se realmente você quer fazer algo que durma 1 segundo ou um pouco mais, pode-se fazer algo como pegar o horário atual (System.currentTimeMillis()), usar o Thread.sleep,
[/quote]

Exatamente, tem casos onde voce precisa ter certeza que vai aguentar os segundinhos… (desenhar algo, pingar algo, etc)

[quote=thingol]Se realmente você quer fazer algo que durma 1 segundo ou um pouco mais, pode-se fazer algo como pegar o horário atual (System.currentTimeMillis()), usar o Thread.sleep,
[/quote]

Desculpa… botao errado, em vez de quote fui com fe’ no edit… desculpe :frowning:

[quote=Guilherme Silveira]Opa opa opa

Cuidado la:

  1. O metodo sleep da classe Thread eh estatico e faz a thread atual dormir o tempo indicado em milisegundos. Cuidado pois se voce recebe uma thread poir exemplo:

void a(Thread t) {
t.sleep(1000);
}

A sua thread ATUAL ira dormir, e nao a thread t

[/quote]

Ué, essa eu não peguei… Se alguém souber o porque isso acontece, me explique por favor…

Muito obrigado,
Tiago

Thread.sleep é um método estático que não pode ser usado para fazer alguma thread “dormir” a distância (para fazer “dormir” a distância, como se fosse alguém hipnotizando você pela televisão, seria necessário usar “suspend” mas esse método não é recomendado)

Só pode ser usado para fazer a thread corrente dormir.

Para quem gosta de saber como é implementado, é mais ou menos como se você chamasse dentro do Java a API Sleep (do Windows) ou sleep (do Unix) dentro do seu programa, e ambas só conseguem fazer a thread corrente dormir.

(Na verdade não é usada a API sleep ou Sleep, mas para muitos efeitos é como se fosse.)

Não adianta fazer algo como:
Thread t = new Thread();
t.sleep(100);
e esperar que “t” durma. Quem vai dormir é a thread corrente.

Se você usar o Eclipse e o plugin do CheckStyle ou PMD, por exemplo, vai receber um warning dizendo para não usar métodos estáticos com variáveis de instância. Portanto ele não gosta de “t.sleep”, sugerindo que você troque por “Thread.sleep”.

[quote=cv]No caso de uma InterruptedException eu nao acho que seja tao importante assim tratar a excecao… em muitos casos ela nao quer dizer muita coisa mesmo, e nao ha muito o que fazer a nao ser sair do bloco try/catch silenciosamente.

Eh a unica exception que nao eh caso excepcional que eu conheco :?[/quote]

InterruptedException é uma exception muito ingrata. Por que se você quer fazer programação multi-threaded que seja eficiente e com baixo tempo de resposta tem que tratar ela em tudo que é canto, principalmente se voce usar Thread.interrupt(). Mas para todos os demais casos é um transtorno sem perigo.

Valew Thingol!!! Eu tinha me esquecido que o método era estático e dessa vez nem olhei a API pra ter tentado ver isso!

[]´s