Ola a todos, alguém poderia me explicar este código:
public class ThreadA {
public static void main(String[] args) {
ThreadB b= new ThreadB();
b.start();
synchronized (b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is " + b.total);
}
}
}
public class ThreadB extends Thread {
int total;
@Override
public void run(){
synchronized (this) {
for (int i = 0; i < 100; i++) {
total+=i;
}
this.notify();
}
}
}
Quando a ThreadMain representada pela classe ThreadA, cheguar na linha 5 b.start();, ela chamara a ThreadB, que começará a executar o seu metodo Run(), que é synchronized, até ai tudo bem. Mas quando a threadA continuar executando as outras linhas de sua classe chegará no metodo:
synchronized (b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is " + b.total);
}
Só que ao meu modo de ver esta instancia “b”, já estará bloqueada pela ThreadB, que bloquea a instancia atual this, que neste caso é o objeto “b”, então esta threadA, não poderia obter o bloqueo deste objeto, não podendo assim chamar wait(), gerando uma excessão IllegalMonitorStateException. Mas acontece que essa exceção não é gerada eh o programa funciona perfeitamente.
Alguem poderia me exlicar porque??
Obrigado