Olá pessoal do GUJ
Li alguns tópicos sobre Interação aqui mas não achei uma resposta para a minha pergunta! Bem ai Vai!
Tenho o Seguinte Código(como podem ver eu estava brincando com ele um Pouco):
public class Duvidas {
public static void main(String args[]) {
Other o = new Other();
o.setName("-A-");
Other oo = new Other();
oo.setName("-AA-");
o.start();
oo.start();
synchronized(o){
try{
System.out.println("waiting for O ...");
o.wait();
System.out.println("O is OK ...");
}catch(InterruptedException e){
System.out.println("Total: " + o.total);
}
}
synchronized(oo){
try{
System.out.println("waiting for OO ...");
oo.wait();
System.out.println("OO is OK ...");
}catch(InterruptedException e){
System.out.println("Total: " + oo.total);
}
}
}
}
class Other extends Thread{
int total;
public void run(){
synchronized(this){
System.out.println("Inicio" +Other.currentThread().getName());
for(int i = 0; i < 10 ; i++){
try {
sleep(400);
System.out.println("Run: "+i+" "+Other.currentThread().getName());
total += i;
}catch (InterruptedException ex) {
System.out.println(ex);
}
}
notifyAll();
}
}
}
Com a Saida(Não Garantida é Claro):
run:
waiting for O … //Ok! entrei no Bloco Synchronyzed
Inicio-A- //OK! Entrei em run() com a Thread "o"
Inicio-AA- //OPA! Como assim? run() Sem Entrar no Bloco Synchronyzed de "oo"
Run: 0 -A-
Run: 0 -AA-
Run: 1 -AA-
Run: 1 -A-
Run: 2 -AA-
Run: 2 -A-
Run: 3 -AA-
Run: 3 -A-
Run: 4 -AA-
Run: 4 -A-
Run: 5 -AA-
Run: 5 -A-
Run: 6 -AA-
Run: 6 -A-
Run: 7 -AA-
Run: 7 -A-
Run: 8 -AA-
Run: 8 -A-
Run: 9 -AA-
Run: 9 -A-
O is OK …
waiting for OO … // Agora que ele vai querer aguardar! e o programa nunca termina!
Bem eu sei que pra poder ter a garantia(que não é verdade pois o agendador é imprevisível) de uma saida uniforme eu preciso sincronizar a classe (Ex: synchronized(Other.class) ), mas não entendo por que quando a 2ª thread “Starta” ela só procura o bloco sincronizado quando termina de rodar(run())?
para deixar mais claro gostaria de saber por que não tenho uma saida mais ou menos assim:
run:
waiting for O … // Entra no Bloco Sincronizado depois em run() …
waiting for OO … // Deixa da rebeldia e também entra no bloco sincronizado antes de entrar em run().
Inicio-A-
Inicio-AA-
Run: 0 -A-
Run: 0 -AA-
Run: 1 -AA-
Run: 1 -A-
Run: 2 -AA-
Run: 2 -A-
Run: 3 -AA-
Run: 3 -A-
Run: 4 -AA-
Run: 4 -A-
Run: 5 -AA-
Run: 5 -A-
Run: 6 -AA-
Run: 6 -A-
Run: 7 -AA-
Run: 7 -A-
Run: 8 -AA-
Run: 8 -A-
Run: 9 -AA-
Run: 9 -A-
O is OK …
OO is OK …
Resumo do resumo
Por que a 2ª thread não faz como a primeira (o -> sync() -> run()) e pula logo pra segunda(oo -| sync() -> run())
Não sei se fui claro, mas caso não avisa ai que eu tento explicar de maneira mais detalhada.
Contudo Agradeço dês de já!