x Sekunden warten, dann Kommando ausführen

Status
Nicht offen für weitere Antworten.

jabbah

Mitglied
Hallo,

bei meinem Programm soll der Benutzer einer beliebige Zeit in Millisekunden eingeben kann und dann nach drücken eines bestimmten Buttons, soll sich das Fenster nach der angegeben Zeit schließen.

Ich dachte, die Zeit, die das Programm abwarten soll, bis es zum nächsten Kommando geht, könnte ich mit wait erreichen.

Ich hab also

Code:
frame.wait(timeToAutoClose);
close();

aber ich bekomm dann folgende Exception

ava.lang.IllegalMonitorStateException


Sagt mir nich viel. In der Doku hab ich zwar etwa gefunden, aber das besagte, dass ich was benutzte, was mir aber gar nicht zusteht (oder sp ähnlich).


Wie kann ich denn sonst meinem Rechner klar machen, dass ich x sekunden warten will und dann soll das Fenster geschlossen werden?

Gruß Jasmin
 
okay, fünf minuten länger nachdedacht und ich wär bestimmt auch auf die lösung gekommen.

Aber trotzdem interessiert es mich, warum ich die Exception bei frame.wait() bekomme
 
API hat gesagt.:
throws IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.
:arrow: ich würde daraus schließen, dass dein frame in einem anderem thread erstellt wurde. aber vermutlich ist das so auch nicht richtig?
 
Um "wait" auf ein Objekt aunzuwenden, muss man den Monitor des Objektes besitzen. Den Monitor bekommt man mit Hilfe von "synchronized". Solange man den Monitor besitzt (und nicht wartet), kann kein anderer Thread den Monitor des Objektes erhalten.

Code:
Frame frame = ...
synchronized( frame ){
  try{
    frame.wait();
  }
  catch( InterruptedException ex ){
    // wird aufgerufen, wenn "interrupt" auf den aktuellen Thread angewandt wurde
  }
}
 
Man sollte vielleicht zu sagen, dass das etwas ganz anderes ist, und normal nicht dazu verwendet wird, x Sekunden zu warten!
Das wait wartet - einfach gesagt - darauf, dass ein anderer Thread die notify() Methode aufruft, und kehrt dann zurück. Man kann eben zusätzlich noch eine maximale Wartezeit angeben.
 
Ist aber auch wirklich ziemlich irritierend definiert. :autsch:

Auf den ersten Blick würde ich eine Zeile wie
Code:
frame.wait()
als eine Aufforderung an frame verstehen, daß er warten soll; worauf auch immer ???:L

Besser wäre vielleicht gewesen, in Object eine Methode einzufügen, daß man
schreiben kann:
Code:
if (irgendwas) {
    waitFor(frame);
}
 
merk dir halt das du wait nur auf ein Objekt anwenden kannst das z.B. durch synchronized gesperrt ist.
uebrigens: wait ist eine Methode aus Object 🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben