Estoy tratando de correr por debajo del programa escrito. Pero aquí estoy recibiendo la excepción como
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at main.java.OddEven$even.run(OddEven.java:16)
at java.lang.Thread.run(Unknown Source)
No puedo encontrar la razón detrás de la excepción.
La exección está ocurriendo en el método de notificación. Obtenemos IllegalMonitorStateException en el método de notificación solo cuando el subproceso actual no es el propietario del objeto de bloqueo.
public class OddEven {
private Integer count = 0;
Object ob = new Object();
class even implements Runnable {
@Override
public void run() {
while (count % 2 == 0) {
synchronized (ob) {
if (count % 2 == 0) {
System.out.println(count++);
notify();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
class odd implements Runnable {
@Override
public void run() {
while (count % 2 != 0) {
synchronized (ob) {
if (count % 2 != 0) {
System.out.println(count++);
notify();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) throws CloneNotSupportedException {
OddEven t1 = new OddEven();
Thread e = new Thread(t1.new even());
Thread o = new Thread(t1.new odd());
e.start();
o.start();
}
}
Respuestas
3 para la respuesta № 1Llamar notify()
en un objeto necesita tener un bloqueo en ese objeto, es decir, estar en un bloque sincronizado en ese objeto. Estás en un bloque sincronizado, pero estás sincronizando en ob
mientras llamas notify()
en this
.
O tienes que usar también ob
para tu notify()
y wait()
llamadas, o sincronizar en this
.