/ / Ausnahme beim Ausführen eines ungeraden Programms mit mehreren Threads - Java, Multithreading

Ausnahme beim Ausführen eines ungeraden geraden Programms mit mehreren Threads - Java, Multithreading

Ich versuche, unter dem geschriebenen Programm zu laufen. Aber hier bekomme ich als Ausnahme

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)

Ich kann keinen Grund für eine Ausnahme finden.

Die Ausführung erfolgt in der Benachrichtigungsmethode. Die Benachrichtigungsmethode "IllegalMonitorStateException" wird nur angezeigt, wenn der aktuelle Thread das Sperrobjekt nicht besitzt.

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();
}

}

Antworten:

3 für die Antwort № 1

Anrufen notify() Für ein Objekt muss eine Sperre für dieses Objekt vorhanden sein, d. h. in einem Block, der für dieses Objekt synchronisiert ist. Sie befinden sich in einem synchronisierten Block, aber Sie synchronisieren auf ob, während Sie anrufen notify()auf this.

Sie müssen entweder auch verwenden ob für dein notify()und wait() Anrufe oder synchronisieren auf this.