Java Thread für unbestimmte Zeit einschlafen lassen

DragonIce

Commander
Registriert
Okt. 2006
Beiträge
2.585
Ahoi Folks,
ich stehe wieder mal vor einem kleinen Problem, zu dem mir keine Lösung über den Weg laufen will.
Ich habe ein kleines Programm (die wichtigen Klassen sind: Model, View, IdleTimer).
Der View ist ein JFrame mit div. JPanels etc. Auf ihm liegt ein KeyListener.
Sobald eine Taste gedrückt wurde, soll der Thread, sofern er nicht aktiv ist, wieder aufgeweckt werden, seine Routine abarbeiten
und sich dann wieder selbst schlafen legen und dies auf unbestimmte Zeit.
Ich habe bereits Diverses mit wait() und notify() ausprobiert, allerdings führte alles zu einer
java.lang.IllegalMonitorStateException

IdleTimer: implementiert Runnable
Model: Initialisiert einen Thread mit dem Objekt IdleTimer als Runnable-Target

Ich hoffe ihr könnt mir weiter helfen.
Falls ihr weitere Infos benötigt, scheut euch nicht zu fragen.

Vielen Dank im Voraus!

Gruß
DragonIce :)
 
Also es gibt im Grunde zwei Möglichkeiten, die ich sehe:
1. Du verwendest eine CyclicBarrier mit 2 Teilnehmern. Der Thread wartet an dieser bis eine Taste gedrückt wird.
2. (ist wohl sauberer und besser threadsafe!): Der Thread hat eine Variable "doWork" und läuft in einer Art Endlosschleife. Die GUI ruft die continueWork-Methode auf wenn was ansteht. Also ungefähr so:
Code:
public class mythread extends Thread{
private boolean doWork = false;

public synchronized void continueWork(){
 doWork=true;
}

public void run() {
 while(true){
   if(doWork){
     // hier das tun was getan werden muss...
     synchronized(this){
      doWork = false; 
     }
   }
   try{
    sleep(100);
   }catch (Exception e){}
 }
}
Alternativ zur Boolean-Variante könnte man es auch mit einer Integer machen, welche entsprechend erhöht und erniedrigt wird. Mit der obigen Boolean-Variante werden Mausklicks nämlich "verschluckt" wenn sie continueWork() aufrufen während der Thread noch am Abarbeiten ist.

Edit: Den Thread kann man dann starten mit
idlethread = new mythread(); // idlethread sollte eine entspr. Klassenvariable sein
mythread.start();
und dann halt bei einem Mausklick/Tastaturklick folgendes ausführen:
mythread.continueWork();
 
Zuletzt bearbeitet:
Vielen Dank, ich werd deinen Vorschlag die Tage mal umsetzen :)
Bzw. das Thread.sleep(x) hab ich schon übernommen - Das war unter anderem etwas, was mir fehlte um die Auslastung des Systems gering zu halten.
Manchmal bin ich echt blödsichtig :p
 
Zurück
Oben