/ / Obtención de una excepción al ejecutar el programa Odd even utilizando varios subprocesos - java, multithreading

Obtención de excepciones al ejecutar el programa Odd even utilizando varios subprocesos: java, multithreading

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 № 1

Llamar 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 obmientras llamas notify()en this.

O tienes que usar también ob para tu notify()y wait() llamadas, o sincronizar en this.