Threads SwingWorker läuft trotz cancel weiter

Casio12

Mitglied
Hallo, ich habe folgende Klasse von SwingWorker erstellt, er wird benutzt um eine Tabelle zu aktualisieren.
Java:
public class MyWorker extends SwingWorker< Void, Void >
{
    protected Void doInBackground() throws Exception
    {
        while( ! this.isCancelled() )
        {
           // Blockierende Warteschlange,
            // Tu was, wenn Daten in Warteschlange verfügbar
            Thread.sleep( 5 );
        }
        return null;
    }

    protected void done()
    {
        try
        {
            System.out.println( "Done: " + this.getState() );
        
        }
        catch ( CancellationException e)
        {
            System.out.println( "Cancel: " + this.getState() );
        }
    }
}
Über einen Button erzeuge und starte ich den Thread:
Java:
        if( this.buttonStart == e.getSource() )
        {
            this.mySw = new MyWorker(  );
            this.mySw.execute();
         }
Über einen weiteren Button beende ich den Thread:
Java:
          else if( this.buttonStop == e.getSource() )
         {
             this.mySw.cancel( true );
         }
Der Thread wird gestartet und die doInBackground() läuft und bei Stop wird done()ausgeführt. Im Eclipse Debug-Fenster bleibt der Thread jedoch als running bestehen.
Bei erneutem betätigen vom Start-Button wird ein neuer Thread im Debug-Fenster erstellt, so lange bis dort 10 Threads sind.
Diese haben alle den Status running. Beim setzen von Breakpoints lande ich in verschiedenen Threads.

Wieso wird der Thread nicht beendet?
 
Zuletzt bearbeitet von einem Moderator:

Casio12

Mitglied
Das klingt schon mal gut.
Dadurch, dass ein erzeugter Thread nicht beendet wird, bevor ich einen neuen erzeuge kommt es zu Fehlverhalten meiner Anwendung.

Ich hatte angenommen, dass ein beendeter Thread auch aus der Debug-Ansicht verschwindet.
Stattdessen werden die Threads mehr und ab dem zehnten wird ein beliebiger Thread von denen wieder ausgeführt.

Hatte mal gelesen das sich SwingWorker aus einem Threadpool bedient. Und dann beendete wieder neu erzeugt.

Kann ich prüfen ob ein Thread wirklich beendet ist? in done() erhalte ich den Status des Threads DONE.

Oder liegt es an noch bestehenden Referenzen in dem Thread auf andere Objekte, dass dieser nicht beendet wird? Wie z.B. auf eine Warteschlange, die vom einem anderen Thread gefüllt wird?
 

Thallius

Top Contributor
So genau kenne ich mich da auch nicht aus aber wenn das done vom Thread aufgerufen wurde, dann kann es ja zu keinem Fehlverhalten kommen da der Thread dann ja nichts mehr macht. Es ist halt nur noch nicht abgeräumt.

Allerdings halte ich es auch für keine guten programmierstil wenn du ständig neue Threads erzeugst. Wenn du einen Thread immer wieder benutzt, dann solltest du ihn auch entsprechend wieder verwenden.

Gruß

Claus
 

Casio12

Mitglied
Der Thread soll nur was machen nachdem ein entsprechender Button gedrückt wurde.
Das neue Erzeugen soll dann sicherstellen, das alle Attribute ihren Initial wert haben. Damit ich nicht jedes Attribut einzeln zurücksetzen muss.
 

Thallius

Top Contributor
Ist aber trotzdem keine saubere Programmierung.

Ohne genau zu wissen was du da machst klingt das für mich so als ob du einen Thread brauchst, der auf abruf eine Aktion durchläuft. Dass bedeutet du solltest eine Queue programmieren in die du deine anfordrung steckst und die der Thread dann abarbeitet.

Also der Main Thread added ein wie auch immer geartetes Objekt in eine List. Der Thread bekommt ein Start geschickt und holt sich das Objekt aus der List und bearbeitet es. Ist er damit fertig schaut er nach ob noch weiter Objekte in der Liste sind . Wenn ja dann arbeitet er solange ab bis die Liste leer ist und geht dann in Idle State und wartet auf das nächste Start Signal from Main Thread.

Gruß

Claus
 

Casio12

Mitglied
Danke für den Vorschlag.

Der Swingworker ist über eine Queue mit einem Thread verbunden, der Daten über eine Socket-Verbindung empfängt und in die Queue ablegt.

Ich würde jetzt bei Stop. Über ein Flag in while-Schleife den Swingworker anhalten und die Socketverbindung schließen. Dadurch wird die Queue nicht weiter gefüllt und es kann deren Inhalt löschen und die restlichen Attribute neu initaliseren.
 

Casio12

Mitglied
Ja. Also die Funktion innerhalb des SwingWorkers funktioniert.
Sobald ich aber diesen Beenden möchte und irgendwann später einen neuen erzeuge kommt es zu den o.g. Problemen

Ein "normaler" Thread von Runnable abgeleitet, verschwindet aus der Debug-Ansicht, wenn er beendet wird.
 
Zuletzt bearbeitet:

Nuiton

Bekanntes Mitglied
Wenn du deinen JTable (nicht) mehr fuellen willst, sobald ein Button gedrueckt worden ist, dann empfehle ich dir du benutzt kein Void, sondern etwas wie Vector (naja, zwar veraltet aber funktioniert noch), oder ArrayList.

Beispiel:
Java:
   @Override
    protected Vector doInBackground() throws Exception
    {         
        Vector row = new Vector();
         // do something lengthy
          if (isCancelled())
          {
                return row;
          }
          else
          {
                // Add rows
                Vector v = new Vector();
                v.add(false);
                // ... etc.
                publish(v);
          }
       return row;
    }
 

Casio12

Mitglied
Mein Tabellenmodel benutzt eine ArrayList. Über Publish sende ich einzelne Objekte an process und Process übergibt wieder eine Liste dieser Objekte an das Model wo sie eingefügt werden

Ich werde deinen Vorschlag mal ausprobieren. Danke.
 

Casio12

Mitglied
Das neue Problem was auftaucht, wenn ich den SwingWorker anhalte, blieben alte Daten im process() Parameter chunks. Diese Daten möchte ich aber gar nicht mehr im TabellenModel haben. Jetzt muss ich diese irgendwie löschen können ...
 

Nuiton

Bekanntes Mitglied
Das hat denke ich wenig mit dem SwingWorker zutun, sondern eher damit, dass du z.B. ein "Start" Button brauchst, und sofort im ActionListener dein JTable leeren sollst, bevor du es fuellst.
Beispiel:
Java:
startButton.addActionListener(new ActionListener()
{
       @Override
        public void actionPerformed(ActionEvent e)
        {
              DefaultTableModel dtm = (DefaultTableModel) meineTabelle.getModel();
              dtm.setRowCount(0);
              // alles andere kommt dannach..
         }
});
 

Casio12

Mitglied
Das tue ich bereits. Habe ich aber nicht erwähnt. Sry.

Beim Start wird mein Modell geleert und anschließend der SwingWorker erzeugt und gestartet.

Das mit den chunks war ne falsche Vermutung von mir. Ich hatte noch Restdaten in enerlokalen Variable die nach Start noch verarbeitet wurden
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C SwingWorker stoppen Java Basics - Anfänger-Themen 7
C SwingWorker mit Fehler Java Basics - Anfänger-Themen 2
O Swingworker/Thread Java Basics - Anfänger-Themen 3
S SwingWorker Java Basics - Anfänger-Themen 3
G SwingWorker funktioniert nicht korrekt Java Basics - Anfänger-Themen 16
G Unterschied zwischen SwingWorker und "normalem" Th Java Basics - Anfänger-Themen 3
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
R CSV Reader läuft nicht richtig an Java Basics - Anfänger-Themen 8
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
V Anfängerfrage: HelloWorld läuft nicht Java Basics - Anfänger-Themen 3
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
Zrebna Programm kann aus der Konsole nicht gestartet werden (in der IDE läuft es) Java Basics - Anfänger-Themen 2
A Java-Programm läuft bei installierter JDK aber nicht mit JRE? Java Basics - Anfänger-Themen 5
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
W Warum läuft mein Programm nicht? Java Basics - Anfänger-Themen 14
D Erste Schritte Java läuft nicht Java Basics - Anfänger-Themen 33
M Erste Schritte while boolean=false läuft nur bei true??? Java Basics - Anfänger-Themen 23
S Programm läuft nicht weiter, wie Code wiederholen? Java Basics - Anfänger-Themen 2
D Programm läuft plötzlich nicht weiter Java Basics - Anfänger-Themen 12
S Input/Output Programm läuft nach input-Abfrage nicht weiter. Java Basics - Anfänger-Themen 2
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
J ireport Designer / CSV / Sonderzeichen was läuft falsch Java Basics - Anfänger-Themen 7
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Netbeans Programm läuft nicht Java Basics - Anfänger-Themen 23
J Dekrement läuft offenbar falsch Java Basics - Anfänger-Themen 6
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
P Methoden Exception läuft endlos! Java Basics - Anfänger-Themen 7
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
D 2d Array läuft nicht rund. Java Basics - Anfänger-Themen 7
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
T Test läuft schief Java Basics - Anfänger-Themen 3
T SQL Abfrage Läuft nicht Java Basics - Anfänger-Themen 5
C Schleife läuft unendlich Java Basics - Anfänger-Themen 2
H Umgebungsvariable In DOS-Box läuft die fehlerfreie Class-Datei nicht. Java Basics - Anfänger-Themen 5
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
K Runnable oder Keyadapter läuft falsch Java Basics - Anfänger-Themen 4
N .jar läuft nicht unter Windows 7 Starter Java Basics - Anfänger-Themen 4
S Programm läuft in Eclipse, aber nicht über Konsole Java Basics - Anfänger-Themen 10
A JFrame läuft ewig? Java Basics - Anfänger-Themen 2
S Konsole schließen, nachdem Jar läuft Java Basics - Anfänger-Themen 5
G Events schreiben, solange Programm läuft Java Basics - Anfänger-Themen 6
B Eingabeüberprüfung läuft nicht wie ich das will... Java Basics - Anfänger-Themen 2
K While-Schleife läuft nicht durch Java Basics - Anfänger-Themen 12
F Schleife läuft zu lang Java Basics - Anfänger-Themen 6
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
M Programm läuft nicht überall Java Basics - Anfänger-Themen 9
O Threads Ein Thread läuft exakt einmal Java Basics - Anfänger-Themen 4
T Programm läuft nicht mehr... Java Basics - Anfänger-Themen 3
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
F sound nur abspielen, wenn er nicht läuft Java Basics - Anfänger-Themen 6
Y Standardprogramm läuft nicht - ppt schreiben Java Basics - Anfänger-Themen 4
D Interpreter-Fehler JavaApplet läuft in der IDE aber nicht im HTML Dokument Java Basics - Anfänger-Themen 9
VfL_Freak Applikation läuft nicht unter Windows7 "platform not supported" Java Basics - Anfänger-Themen 15
A Jlayer: Wie sound stoppen der in einem Thread läuft Java Basics - Anfänger-Themen 7
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
P simples Program läuft nicht ;? Java Basics - Anfänger-Themen 9
S jProgressBar läuft nicht! Java Basics - Anfänger-Themen 13
B JavaWebStart - Anwendung läuft nur auf einem Rechner Java Basics - Anfänger-Themen 6
M Audio Stream läuft auf :connection abort: socket write error Java Basics - Anfänger-Themen 2
B Programm läuft mit 100% CPU-Last Java Basics - Anfänger-Themen 6
E Projekt fast fertig, nur es läuft nicht ;) Java Basics - Anfänger-Themen 7
R .jar läuft nicht unter Linux Java Basics - Anfänger-Themen 11
R Jar Datei läuft auf neuem Rechner nicht mehr Java Basics - Anfänger-Themen 15
Z Applet mit Mandelbrot und Juliam. läuft nicht rund Java Basics - Anfänger-Themen 6
P Java Programm läuft nicht auf MAC Java Basics - Anfänger-Themen 7
J Programm läuft in Netbeans, aber nicht in der Konsole Java Basics - Anfänger-Themen 6
L Programm läuft nicht! Warum? Java Basics - Anfänger-Themen 5
G If-Schleife läuft ohne erfüllte Bedingung Java Basics - Anfänger-Themen 13
-horn- Was passiert, wenn Zähler über Integer Max läuft? Java Basics - Anfänger-Themen 9
H Split läuft nicht wie ich will Java Basics - Anfänger-Themen 4
N Brauche dringende Hilfe Java Aplett läuft nicht! Java Basics - Anfänger-Themen 3
G Mittels Runtime prüfen ob ein Programm läuft? Java Basics - Anfänger-Themen 18
A Netbeans unter Windows/Jar läuft nicht auf Mac Java Basics - Anfänger-Themen 7
N FileClassLoader läuft nicht in Tomcat Java Basics - Anfänger-Themen 5
G Was bracuht man, damit Java läuft? Java Basics - Anfänger-Themen 6
G Eine HP mit Java läuft nicht Java Basics - Anfänger-Themen 4
B Programm läuft.aber objektorientiert genug? :( Java Basics - Anfänger-Themen 9
S classe unter windows kompiliert läuft nicht unter linux? Java Basics - Anfänger-Themen 8
G jar läuft nur in eingabeaufforderung Java Basics - Anfänger-Themen 12
P Warum läuft das nicht? Java Basics - Anfänger-Themen 6
L [gelöst] Einfache Aufgabe, läuft aber nicht. Java Basics - Anfänger-Themen 8
S "einfache Klassengeschichten" keine Fehler, läuft Java Basics - Anfänger-Themen 2
G Gauss Applet läuft nicht Java Basics - Anfänger-Themen 9
P kleine db-aufgabe läuft nur suboptimal Java Basics - Anfänger-Themen 8
K eclipse läuft nich Java Basics - Anfänger-Themen 3
M Java läuft nicht Java Basics - Anfänger-Themen 5
I Keine zwei Objekte im Fenster möglich? Was läuft falsch? Java Basics - Anfänger-Themen 5
M Lottoprog. läuft nicht Java Basics - Anfänger-Themen 6
C Applikation läuft nur, wenn sie aus Netbeans gestartet wird Java Basics - Anfänger-Themen 6
C Thread läuft und läuft, trotz interrupt() Java Basics - Anfänger-Themen 9
N läuft der thread eigentlich weiter? Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben