Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine IllegalMonitorStateException und kann mir nicht erklären warum. Die Methode in der sie auftritt sieht vereinfacht so aus:
Java:
public void methode(){
lock.lock();
....(ne ganze reihe anweisungen, aber kein unlock())
long warteZeit= Berechnung der Wartezeit(...);
try{
myCondition.awaitNanos(warteZeit);
catch(InterruptedException e){
}finally{
lock.unlock;
}
}
die Exception tritt im finally-Block bei lock.unlock() auf.
Aus einem anderen Thread wird eine andere Methode der selben Klasse aufgerufen, die so aussieht:
Java:
public void aufweckMethode(){
lock.lock();
myCondition.signal()
lock.unlock();
}
Eine IllegalMonitorStateException gibts doch, wenn der Thread nicht den Lock hat. Aber wie kann das sein?
Jedes Objekt besitzt über die Klasse java.lang.Object die Methoden wait() und notify(). Ein Thread, der über den Monitor verfügt, kann die Methoden aufrufen und sich so in einen Wartezustand versetzen oder einen anderen Thread aufwecken. Diese Möglichkeit gibt es seit Java 1.0. (Es ist schon ein wenig seltsam, dass Java für die Synchronisation ein eingebautes Schlüsselwort hat, aber die Benachrichtigung über Methoden realisiert.)
Nun ja, aber ich verwende ja grade nicht wait und notify. Sonder halt await und signal über die neue synchronisationsmethode mit lock und condition. Entweder ich stehe auf dem Schlauch, oder wir reden komplett aneinander vorbei.
KSKB?? Sagt mir leider gar nichts. Bei Wikipedia und google auf die schnelle auch nicht gefunden, was du meinst .
Oh, als ToolTip bekommt man es angezeigt. Tja, ja.
Mhh, ja, ich glaube, das ist ohne weiteres nicht möglich. Der Fehler wird dann vermultich in den Anweisungen zwischen lock und unlock liegen. Aber wie gesagt, ein unlock wird da nicht vorgenommen. Aber halt ein Haufen anderer Anweisungen (ziemlich verschachtelt, würde seiten füllen). Meine Frage daher auch: Gibt es irgendwas anderes (ausser unlock) das den Fehler erklären würde?
Wenn in diesen "vielen Anweisungen" direkt oder indirekt ein "wait" oder "notify" oder "notifyAll" aufgerufen wird. Poste ggf. mal den StackTrace, und die Codezeilen, auf die er sich bezieht.