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:
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.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()); }
El otro hilo tiene el siguiente codigo:
Código:
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 .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++; } } }
La variable movido esta declarada en funcionesMapa y esta declarada como:
Código:
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.private static Boolean moviendo=false;
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.