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.