Thread in Methode + raus aus der Schleife

ChrisBT

Mitglied
Guten Morgen zusammen,
ich steh bei dieser Geschichte etwas auf dem Schlauch und brauche eure Hilfe.
Ich habe vor, Daten jede Sekunde aus einer Datenbank zu lesen und mit JFreechart zu visualisieren.
Ich denke, dass sollte in einem Thread passieren und deswegen habe ich das Experimentieren angefangen.
Mein Problem ist, dass ich es absolut nicht hinbekomme, die While-Schleife oder den Thread mittels Start/Stop-Button anzustoßen bzw anzuhalten. Das muss sein, da man später in dem Chart auch hin und her springen muss, z.B. um sich die Daten von vor einer Stunde anzuschauen.
Hier mal mein kläglicher Versuch.
Mittlerweile befindet sich der Threadstart in einer Funktion, weil ich mir dachte, dass man die einfacher ansprechen kann. Start des Threads und damit der Schleife ist natürlich so kein Problem. Allerdings das Stoppen gelingt mir absolut nicht. Die Schleife verhält sich absolut merkwürdig. Beim Übergeben von "1" bricht sie ab, es kommt ein System.Out.println unter der Schleife und dann springt die Ausführung sofort wieder in den Else if-Block der Schleife???
Hier der Code:
Java:
public void z_thread(int run_thread)
    {
        System.out.println("Vor der Schleife " + run_thread);
         new Thread(new Runnable(){
            @Override
            public void run() {
                int r = run_thread;
                System.out.println("Erste Abfrage vor Schleife von r " + r);
                System.out.println("Zweite Abfrage von run_thread " + run_thread);
                while(true){            
                    if (r == 1)
                    {
                        System.out.println("Im IF-Block, Variable r:  " + r);
                        break;                
                    }
                    else if (r == 0)
                    {
                        System.out.println("Im ELSE-IF_Block, Variable r: " + r);
                        jLabel3.setText(new SimpleDateFormat("HH:mm:ss").format(new Date(System.currentTimeMillis() - 3600 * 1000)));
            
                        try{ Thread.sleep(1000); } catch(InterruptedException e){}
                
            
                    }
                    else {System.out.println("Im ELSE-Block, Variable r: " + r);}
                }
                System.out.println("Im RUN-Block");
        
            }   
        }).start();
Mit diesem Code läuft in einem JFrame eine Uhr in einem Label. Darunter befinden sich zwei Buttons (Start und Stop) die die Funktion z_thread() mit 0 oder 1 aufrufen.
Die Terminalausgaben habe ich eingefügt, weil ich verstehen wollte, was da passiert.

Viele Grüße
Chris
 
Zuletzt bearbeitet:

Robat

Top Contributor
Dein Problem ist da du, jedes mal wenn du die Methode z_thread(int) aufrufst, eine neuen Thread erstellst. Du wirst also niemals den ersten Thread den du startest beenden sondern immer einen neuen erstellen und den neuen beenden. Der erste Thread wird nie beendet / angesprochen werden
 

ChrisBT

Mitglied
Aha, dann ist es ja kein Wunder...
Ich habe die Funktion beim Start des JFrames automatisch mit 0 aufgerufen. Die Uhr läuft also im z.B. Thread1.
Dann klicke ich auf den Stop-Button und rufe die Funktion mit 1, auf. Dadurch bricht zwar die Schleife ab, aber gleichzeitig wird ein neuer Thread gestartet, der dann zu den merkwürdigen Ausgaben im Terminal führt.
Habe ich das so richtig verstanden?
Was ich aber immer noch nicht verstehe ist, dass ich ja durch den Stop-Button, der Funktion eine 1 gebe, die dann doch zum Abbruch der While-Schleife,die ja dann im neuen Thread läuft, führen muss. Komisch... die läuft aber weiter.
Ich denke, ich muss da vollkommen anders ran gehen.
Der Thread muss mit dem Stop-Button beendet werden, oder?
 

Meniskusschaden

Top Contributor
Dann klicke ich auf den Stop-Button und rufe die Funktion mit 1, auf. Dadurch bricht zwar die Schleife ab,
Nein, sie läuft weiter. Der erste Thread wird durch den erneuten Aufruf deiner Methode überhaupt nicht beeinflusst.
aber gleichzeitig wird ein neuer Thread gestartet
Ja, es wird ein neuer Thread gestartet, der aber schnell wieder beendet wird. So wie du es für den Fall r==1vorgesehen hast.
der dann zu den merkwürdigen Ausgaben im Terminal führt.
Die sind nicht merkwürdig. Aber es sind Ausgaben aus zwei Threads. Da du die Variable r ausgibst, müsstest du auch sehen können, welche Ausgabe zu welchem Thread gehört.
 

Robat

Top Contributor
Ich denke, ich muss da vollkommen anders ran gehen.
Der Thread muss mit dem Stop-Button beendet werden, oder?
Ich würde mir grundsätzlich von Anfang an nur einen Thread erstellen der die Zeit berechnet und sie auf dem Label ausgibt.
Mittels deiner beiden Buttons kannst du dann den Thread entweder starten oder stoppen und musst nicht immer einen neuen erstellen.
 

ChrisBT

Mitglied
Erst mal vielen Dank für euer Interesse.
Ich habe jetzt jetzt noch mal ganz anders angefangen.
Schaut mal:
Java:
Thread t = new Thread()
    {
        @Override
        public void run()
        {
          
            while(! isInterrupted() )
            {
                jLabel3.setText(new SimpleDateFormat("HH:mm:ss").format(new Date()));
              
                try
                {
                    Thread.sleep( 1000 );
                }
                catch (InterruptedException e)
                {
                    interrupt();
                    //System.out.println("Unterbrechung in sleep()");
                }
            }
            
        }
    };
Der Thread t wird über Start-Botton gestartet:
Java:
private void startActionPerformed(java.awt.event.ActionEvent evt) {                                     
        t.start();
    }
Gestoppt wird über Stop-Button:
Java:
private void stopActionPerformed(java.awt.event.ActionEvent evt) {                                   
        t.interrupt();
    }
Starten funktioniert.
Stoppen funktioniert.
Erneutes Starten geht aber nicht.
Es kommen jede Menge Fehlermeldungen unter der Ausgabe:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException

Habt ihr eine Idee?
 

Robat

Top Contributor
Du kannst einen gestoppten Thread nicht neu starten ;)
Was du machen kannst ist, sobald der alte Thread gestoppt ist, einen neuen zu erstellen.
Was du auch machen kannst ist das Runnable Interface auszulagern, so musst du die Logik nicht immer neu implementieren :)
 

ChrisBT

Mitglied
Mann war das eine Geburt. :)
Ich denke, ich habe es jetzt hinbekommen.
Wenn es keine große Mühe mach, könnt Ihr ja nochmal drüber schauen, ob das so ok ist, oder ob sich durch diese Art und Weise spätere Probleme ergeben könnten.
Java:
Thread t = new Thread()
    {
        @Override
        public void run()
        {
            System.out.println("Es gibt ein Leben vor dem Tod. ");
          
            while(! isInterrupted() )
            {
                while(true)
                    {
                        if (wait_t == true)
                        {
                            try
                            {                   
                                Thread.sleep( 1000 );                   
                            }
                            catch (InterruptedException e)
                            {
                                interrupt();
                            }
                        }
                        else
                        {
                            jLabel3.setText(new SimpleDateFormat("HH:mm:ss").format(new Date()));                   
              
                            try
                            {                   
                                Thread.sleep( 1000 );                   
                            }
                            catch (InterruptedException e)
                            {
                                interrupt();
                               
                            }
                        }
                    }
               }
        }
    };
Über die Start/Stop-Buttons gibt es nun wait_t = true oder false.
Bei wait_t == true dreht die 2. While-Schleife ihre Runden, bis wait_t == false ist.

Wäre das so ok?
Vielen Dank noch mal!
Gruß
Chris
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Das while(true)inklusive der zugehörigen Klammern kann meines Erachtens entfallen. Allerdings pausiert dein Thread im Fall wait_t==truenicht wirklich. Da könntest du genau so gut auch einfach nur die Textänderung von wait_tabhängig machen, ohne den ganzen try-Block zu doppeln.
Um den Thread wirklich pausieren zu lassen, könntest du vielleicht mit wait() und notify()arbeiten, aber da hängt dann noch etwas mehr dran. Ich glaube, der Vorschlag von @Robat ist einfacher, also beim Stop-Button den Thread einfach mit interrupt() zu stoppen und beim Start-Button einen neuen Thread zu erzeugen.
 

ChrisBT

Mitglied
Sorry, ich bin noch Anfänger.
Also wenn ich das richtig verstehe, soll ich den ganzen Code dem Startbutton zuordnen und den Stop-Button nur t.interrupt() machen lassen? Wird dann nicht wieder gemeckert, dass ich den gerade geschlossenen Thread wieder starten will? Oder ist das so, also den kompletten Code beim Start-Button, etwas anderes?
 

Meniskusschaden

Top Contributor
Wird dann nicht wieder gemeckert, dass ich den gerade geschlossenen Thread wieder starten will?
Das passiert nur wenn du versuchst, den alten Thread erneut zu starten, denn der ist dann bereits im Status TERMINATED und kann nicht erneut gestartet werden. Es spricht aber nichts dagegen, einfach einen neuen Thread zu erstellen und deiner Variablen t zuzuweisen. Der ist dann zunächst im Status NEW und kann demzufolge noch gestartet werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
S Rückgabewert null in Methode mit Thread Java Basics - Anfänger-Themen 2
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
T Threads Neuen Thread nicht aus main-Methode starten Java Basics - Anfänger-Themen 3
P Threads Thread und Zugriff auf externe Methode beenden Java Basics - Anfänger-Themen 4
Dit_ Thread | Schleifenlose run-Methode unterbrechen. Java Basics - Anfänger-Themen 23
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
R Thread in ActionPerformed-Methode unbekannt? Java Basics - Anfänger-Themen 4
J Thread innerhalb einer Methode starten Java Basics - Anfänger-Themen 3
G Methode nicht im Event-Dispatcher-Thread starten? Java Basics - Anfänger-Themen 2
G Thread in der run-Methode beenden Java Basics - Anfänger-Themen 6
E AWT-Thread, Abarbeitung Methode Java Basics - Anfänger-Themen 2
G Thread mit neuer methode Java Basics - Anfänger-Themen 6
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben