IllegalMonitorStateException

Neu

Mitglied
Ich habe folgende Klassen:

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?
 

KonradN

Top Contributor
Du rufst wait auf dem jeweiligen Consumer / Producer auf und von diesen Objekten hast Du kein Monitor. Den Monitor hast Du auf dem lager.

Daher müsstest Du wait / notify(All) auch auf dem Lager aufrufen. (Macht ja asonst auch kein Sinn. Das wait auf dem Producer wartet darauf, dass auf genau diesem Producer auch ein notify(All) aufgerufen wird.
 

Ähnliche Java Themen


Oben