Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/10/2010, 09:40
nosek159
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 16 años, 1 mes
Puntos: 2
sincronizacion hilos

Hola a todos.
Tengo un problema con los metodos .wait() y .notify(),
La estructura de mi programa es la siguiente:

Un hilo con tiene el siguiente codigo:

Código:
public void run() {

        boolean existencia=monstruo.isVivo();

        Heroe heroe=null;
        Boolean moverse=false;

        while (existencia){
            moverse=false;
            heroe=monstruo.localizaHeroe();
            if(monstruo.getEstado()==monstruo.BUSCANDO){
                moverse=monstruo.actualizaPosicion();
            } else if (monstruo.getEstado()==monstruo.ATACANDO) {
                monstruo.ataca(heroe);
            } else if (monstruo.getEstado()==monstruo.ENCONTRADO) {
                monstruo.persigueHeroe(heroe);
                moverse=true;
            }
            HiloAnimarMonstruo hiloAnda = new HiloAnimarMonstruo(monstruo);
            animaMonstruo = new Thread(hiloAnda);
            animaMonstruo.start();
            int i=0;
            synchronized (FuncionesMapa.getMoviendo()){
                if(FuncionesMapa.getMoviendo()){
                    try {
                        FuncionesMapa.getMoviendo().wait();
                    } catch (InterruptedException ex) {
                        java.util.logging.Logger.getLogger(FuncionesMapa.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                while (i<16 && moverse){
                    monstruo.mueveteEnMapa();
                    i++;
                    try {
                    Thread.sleep(60);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Monstruo.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            FuncionesMapa.setMoviendo(false);
            FuncionesMapa.getMoviendo().notify();
            try {
                Thread.sleep(monstruo.getVelocidad());
            } catch (InterruptedException ex) {
                Logger.getLogger(HiloMoverMonstruo.class.getName()).log(Level.SEVERE, null, ex);
            }
            existencia=monstruo.isVivo();
        }
        FuncionesMapa.destrulleMonstruo(monstruo);
        try {
            Thread.sleep(monstruo.getReaparicion());
        } catch (InterruptedException ex) {
            System.out.println("Error en la reaparicion del monstruo");
        }
        FuncionesMapa.asignaMonstruo(posY, posX, monstruo.getRefImg());
        

    }
Esto lo que hace es que si FuncionesMapa.getMoviendo() devuelve true significa que el otro hilo lo ha puesto true y por lo tanto este debe esperar. Cuando se activa hace su trabajo, pone moviendo a false y avisa al otro hilo de que puede seguir.

El otro hilo tiene el siguiente codigo:
Código:
public void run() {

        boolean andado=true;
        int algo=0;
        
        synchronized (FuncionesMapa.getMoviendo()){
            if(!FuncionesMapa.getMoviendo()){
                try {
                    FuncionesMapa.getMoviendo().wait();
                } catch (InterruptedException ex) {
                    java.util.logging.Logger.getLogger(FuncionesMapa.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            FuncionesMapa.setMoviendo(true);
            FuncionesMapa.getMoviendo().notify();
            while (algo<16 && andado){
                andado=FuncionesMapa.moverMapa(direccion, layerViewer);
                FuncionesMapa.calculaProporcion();
                FuncionesMapa.actualizaMonstruos(direccion);
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    System.out.println(e.toString());
                }
                algo++;
            }
        }
        

    }
de forma que si moviendo esta en false espera a que a que el otro hilo le avise, despues pone moviendo a true i avisa al otro hilo de que puede empezar y hace su trabajo .

La variable movido esta declarada en funcionesMapa y esta declarada como:
Código:
private static Boolean moviendo=false;
Con esto lo que quiero conseguir es que los 2 hilos se puedan ejecutar al mismo tiempo pero si 1 termina antes que el otro i vuelve a empezar no pueda entrar en esta zona hasta que el otro no haya terminado tambien.

El problema es que al ejecutarse me salta el siguiente error:

Exception in thread "Thread-7" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)

y nose porque. Si alguien me pudiese ayudar se lo agradeceria.


Saludos y gracias de antelacion,
Dani.