Dúvida Thread

8 respostas
T
iae galera.. tava vendo uma questãozinha de thread aqui e surgiu uma dúvida nesse código ...
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();
	}
}
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..! :)

valeuz!!

8 Respostas

ViniGodoy

E por que você acredita nisso?

Rode no java e veja o que acontece.

T

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
T

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

obrigado!

ViniGodoy

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?

ViniGodoy

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

soaresinfo

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.

T

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!

ViniGodoy

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!

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

Criado 25 de julho de 2011
Ultima resposta 25 de jul. de 2011
Respostas 8
Participantes 3