Ich habe folgende Klassen:
KLASSE LAGER:
KLASSE PRODUCER
KLASSE CONSUMER
PROGRAMM
Warum bekomme ich hier den folgenden Fehler?
Ich hab ein wenig darüber gelesen. Die IllegalStateException wird geworfen, wenn beispielsweise wait() oder notify() außerhalb eines synchronized Blocks aufgerufen wird. Aber ich verstehe es nicht ganz. Wie funktioniert wait() und notify()? Und warum tritt der Fehler auf?
KLASSE LAGER:
Java:
package test;
public class Lager {
private int inhalt;
public boolean isFull;
public Lager() {
isFull= false;
}
public int getInhalt() {
return inhalt;
}
public void setInhalt(int inhalt) {
this.inhalt= inhalt;
}
}
KLASSE PRODUCER
Java:
package test;
import java.util.Random;
public class Producer {
private Lager lager;
public Producer(Lager lager) {
this.lager= lager;
}
public void produce() {
synchronized (lager) {
try {
while (lager.isFull)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Random rnd= new Random();
lager.setInhalt(rnd.nextInt(101));
notify();
lager.isFull= true;
}
}
}
KLASSE CONSUMER
Java:
package test;
public class Consumer {
private Lager lager;
public Consumer(Lager lager) {
this.lager= lager;
}
public void consumeFromLager() {
synchronized (lager) {
try {
while (!lager.isFull)
wait();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
System.out.println("Consume " + lager.getInhalt());
notify();
lager.isFull= false;
}
}
}
PROGRAMM
Code:
package test;
import java.util.Formatter;
import java.util.Locale;
import javafx.scene.control.Button;
public class Test {
public static void main(String[] args) {
Lager lager= new Lager();
Thread a= new Thread(() -> {
Producer p= new Producer(lager);
for (int i= 0; i < 100; i++) {
p.produce();
}
}
);
a.start();
Thread b= new Thread(() -> {
Consumer c= new Consumer(lager);
for (int i= 0; i < 100; i++) {
c.consumeFromLager();
}
}
);
b.start();
}
}
Warum bekomme ich hier den folgenden Fehler?
Java:
Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at test.Producer.produce(Producer.java:20)
at test.Test.lambda$0(Test.java:15)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at test.Consumer.consumeFromLager(Consumer.java:12)
at test.Test.lambda$1(Test.java:23)
at java.lang.Thread.run(Unknown Source)
Ich hab ein wenig darüber gelesen. Die IllegalStateException wird geworfen, wenn beispielsweise wait() oder notify() außerhalb eines synchronized Blocks aufgerufen wird. Aber ich verstehe es nicht ganz. Wie funktioniert wait() und notify()? Und warum tritt der Fehler auf?