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…!
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
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.