Funktionsziel: Starten eines Prozesses auf bestimmte Wiederholdauer und jederzeitiges Stoppen.
Ich habe ein kleines UI, das einen Start- und Stop-Button besitzt. Es gibt noch eine JComboBox mit Sekunden zur Auswahl. Die werden dann als sleep-time hergenommen für den Thread.sleep, der sich in der run-methode meines Threads befindet.
Des Problem bei mir ist jetzt, wenn einma der Start-Button angeklickt wurde, kann ich nie mehr irgendeine Aktion auf meiner UI ausführen, die eine Wirkung hat. Der Stop-Button hätte eigentlich die Funktion den Thread zu interrupten, aber ich kann ihn ja leider nicht klicken...
Wie muss ich da vorgehen?
hier mein Thread:
Java:
publicclassKeyPressingRunnerextendsThread{publicvoidrun(long msInterval){while(!isInterrupted()){System.out
.println("I am running every "+ msInterval/1000+" seconds.");try{Thread.sleep(msInterval);}catch(InterruptedException e){// TODO Auto-generated catch block
e.printStackTrace();}}}
du musst die Ausführung des Threads über dessen [c]start()[/c] einleiten. Dadurch wird dessen [c]run()[/c] im neuen Thread ausgeführt. Führst du sie hingegen direkt aus, bleibt der aktuelle Thread (in diesem Fall der Event Dispatch Thread) damit beschäftigt.
Wichtig ist auch, dass die [c]run()[/c] überschrieben (oder ein Runnable im Konstruktor übergeben) wird. In deinem Code ist das nicht der Fall.
Das Intervall könntest du dem Konstruktor übergeben. Deine Ausgabe ist wegen Ganzzahldivision nicht ganz korrekt, daher lieber durch [c]1000d[/c] teilen. Schließlich würde dein Thread womöglich bis zum Beenden der Anwendung laufen, denn (aus der Doku von [c]sleep(long)[/c]):
Throws: InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
Im catch-Block musst du also noch etwas unternehmen. Ein [c]interrupt()[/c] oder [c]break[/c] oder auch ein [c]return[/c] würden zum Beenden der Ausführung führen.
Letztendlich könnte deine Klasse also so aussehen:
Java:
publicclassKeyPressingRunnerextendsThread{privatefinallong msInterval;publicKeyPressingRunner(long msInterval){this.msInterval = msInterval;}@Overridepublicvoidrun(){while(!isInterrupted()){System.out.println("I am running every "+ msInterval /1000d+" seconds.");try{Thread.sleep(msInterval);}catch(InterruptedException e){
e.printStackTrace();interrupt();}}}}