Foros del Web » Programación para mayores de 30 ;) » Java »

Threads wait() y notifyAll()

Estas en el tema de Threads wait() y notifyAll() en el foro de Java en Foros del Web. Hola, tengo un programa que genera 3 threads "DadoThread" que debería mostrar las tiradas y pararse al encontrar 3 Seises. PRINCIPAL Código PHP: public class  MainDados  ...
  #1 (permalink)  
Antiguo 19/02/2013, 14:41
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 36
Antigüedad: 13 años, 3 meses
Puntos: 5
Threads wait() y notifyAll()

Hola, tengo un programa que genera 3 threads "DadoThread" que debería mostrar las tiradas y pararse al encontrar 3 Seises.

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");
    }

Thread
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);    
        }
    }

Comprobacion de dados
Código PHP:
public class ComprobarDados{
    
    static 
boolean tripleSeis=false;
    static 
int numDado1numDado2numDado3;
    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==&& numDado2==&& 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();    
        }
    }

//La clase del Aleatorio no la pongo ya que funciona correctamente.

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.

Última edición por alx1417; 20/02/2013 a las 19:13

Etiquetas: threads
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:55.