Dúvida Thread

iae galera…
tava vendo uma questãozinha de thread aqui e surgiu uma dúvida nesse código …

[code]public class Tester {
public static void main(String[] args) throws InterruptedException {
Runnable t1 = new Runnable() {
public void run() {
try {
System.out.print(“t1before”);
Thread.sleep(100);
System.out.print(“t1after”);
} catch (InterruptedException e) {
}
}
};

	final Thread t2 = new Thread() {
		public void run() {
			try {
				System.out.print("t2before");
				wait();
				System.out.print("t2after");
			} catch (InterruptedException e) {
			}
		}
	};

	t2.start();
	new Thread(t1).start();
}

}[/code]
blz que o método wait() pode resultar em IllegalMonitoStateException, caso o objeto chame o wait em uma thread que não possui o bloquei dele e por isso devemos colocá-lo sempre em um bloco synchronized. Porém, nesse caso, no momento que o wait() é chamando … acredito que ele vá ter o bloqueio do objeto. Quem mais poderia estar com o bloqueio do t2 nesse código?

obs.: esse código está resultando em um IllegalMonitoStateException…! :slight_smile:

valeuz!!

E por que você acredita nisso?

Rode no java e veja o que acontece.

ViniGodoy, eu tinha rodad! .e dah o erro que falei!
A saída na minha jvm é essa…

t2beforet1before
[color=red]Exception in thread “Thread-0” java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at cap9.Tester$2.run(Tester.java:24)[/color]
t1after

opa. acho que agora ficou claro. tinha feito confusão com os conceitos do wait e do bloco synchronized com os bloqueios!

obrigado!

Então, não há bloqueio do objeto. A exception é disparada, igual a teoria dizia que ia acontecer.
Não entendi, qual é a sua dúvida?

Ops. Eu postei e vi que vc tinha respondido. hehhehehe

Como você chamou o wait da classe Tester, a thread main está com o lock da tester, e quando chamou o wait, você estava fazendo isso usando a thread t2, resultando na exception.

soaresinfo, eu chamei o wait da classe Tester? pra mim, eu estou tentando chamar só o wait do t2 e, como não estou em um contexto synchronized, não obtenho o bloqueio dele resultado na exceção!

soaresinfo, eu chamei o wait da classe Tester? pra mim, eu estou tentando chamar só o wait do t2 e, como não estou em um contexto synchronized, não obtenho o bloqueio dele resultado na exceção!
[/quote]

É isso mesmo thiago.

Aliás, soares, a thread main também não possui lock nenhum. Não há um bloco sincronizado sequer nesse código.