PRINCIPAL
Código PHP:
public class MainDados {
public static void main(String[] args) {
DadoThread Dado1=new DadoThread("Dado1");
DadoThread Dado2=new DadoThread("Dado2");
DadoThread Dado3=new DadoThread("Dado3");
Dado1.start();
Dado2.start();
Dado3.start();
try {
Dado1.join();
Dado2.join();
Dado3.join();
} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("Fin del Main");
}
}
Código PHP:
public class DadoThread extends Thread{
GenerarNumAleatorio aleatorio=new GenerarNumAleatorio();
ComprobarDados comprobar=new ComprobarDados();
String nombre;
DadoThread(String nombre){
this.nombre=nombre;
}
public void run(){
while(!comprobar.tripleSeis){
if(nombre.equalsIgnoreCase("Dado1")){
comprobar.numDado1=aleatorio.numAleatorio(6);
}
if(nombre.equalsIgnoreCase("Dado2")){
comprobar.numDado2=aleatorio.numAleatorio(6);
}
if(nombre.equalsIgnoreCase("Dado3")){
comprobar.numDado3=aleatorio.numAleatorio(6);
}
comprobar.comprobarTripleSeis(nombre);
}
}
}
Código PHP:
public class ComprobarDados{
static boolean tripleSeis=false;
static int numDado1, numDado2, numDado3;
static boolean tirado;
int tiradas=0;
static int i=0;
public synchronized void comprobarTripleSeis(String nombre){
i++;
if(i<3){
try{wait();}
catch(InterruptedException e){System.out.println("Interrupcion del hilo...");}
System.out.println("Desperado "+nombre);
}else{
tripleSeis = numDado1==6 && numDado2==6 && numDado3==6;
tiradas++;
System.out.println("Dado1=" +numDado1+" Dado2=" +numDado2+" Dado3="+numDado3+" Tirada="+tiradas);
if(tripleSeis)
System.out.println("Has sacado 3 seises en la tirada: "+tiradas);
numDado1=0;
numDado2=0;
numDado3=0;
i=0;
notifyAll();
}
}
}
Según mi lógica (errónea por lo visto) sucede lo siguiente:
-Declaro los 3 threads(DAdo1, Dado2 y Dado3) y los inicio.
-Cada dado recoge un numero según su nombre y se va a la función comprobarTripleSeis().
-Este es un método sincronizado, así que entra el primero (ej. el dado1), la i=1 por lo que entra en el wait() i se espera.
-Entonces entra el dado2, la i=2 así que también se espera.
-Por último entra el dado3, la i=3 por lo que se salta el if, comprueba si son 6,pone a 0, etc. y despierta a los otros 2 dados.
-En ese momento deberían mostrarse los mensajes de "Despierta" y continuar la ejecución del programa, pero lo que sucede es:
El dado3 vuelve a recoger un numero aleatorio, entra a comprobar, como i=1 hace el wait() y ahí se quedan los 3 dados esperando en el wait()...
Mi duda es porque no se despiertan al hacer el notfyAll() ??
Espero haberme explicado bien...
Muchas gracias.
EDITO:
Alguien puede echarme una mano? Si no se entendió bien preguntadme e intentare explicar mi problema de otra forma.
Gracias.