SwingWorker verschwindet nicht

Iron Monkey

Bekanntes Mitglied
Hi!

Warum verschwindet der SwingWorker nicht, wenn die Methode "done()" zum Schluss bereits durchgeführt ist? ( siehe Bild )
Ich habe hier im Forum auch erfahren, dass der SwingWorker nur einmal durchführen kann! Wenn ja, was mache ich jetzt nun?

Hier ist mein Code:

Wenn ich das Fenster mit "JFrame" öffne, dann wird der SwingWorker in der Methode "processWindowEvent" unter WindowEvent.WINDOW_OPENED ausgeführt und sobald der SwingWorker vollständig fertig ist, verschwindet der im Prozess nicht! (siehe Bild) Ich verwende zum ersten Mal mit SwingWorker von Java 6! Was habe ich nun falsch gemacht?

Java:
new SwingWorker<Void, String>()
			{
				private ArrayList<ArrayList<Object>> listTermine = null;

				// Job wird in eigenem Thread ausgeführt.
				// Hier dürfen keine Manipulationen an Swing-Komponenten stattfinden.
				@SuppressWarnings("unchecked")
				@Override
				protected Void doInBackground() throws Exception
				{
					MomentDialogWithConsole moment = new MomentDialogWithConsole( parent, false, mcd_RLH );
					
					// Bediener-Gruppe aus der DB holen und anschliessend in die JList füllen!
					moment.setText( "Bediener-Gruppe holen" );
					Vector<String> listBedienerGruppe = ByteConverter.readBedienerGruppeFromDB( parent, mcd_RLH, mcd_RLH.USERID, true );

					if( listBedienerGruppe != null )
					{
						oldBedienerGruppe = (Vector<String>) listBedienerGruppe.clone();
						
						for( String elemente : listBedienerGruppe )
							publish( elemente );
						
						listBedienerGruppe.add( mcd_RLH.USERID );

                                                .....
					}
					
					moment.setText( "Termine holen" );
					if( listBedienerGruppe != null )
					{
						for( int i = 0; i < listBedienerGruppe.size(); i++ )
						{
							if( isCancelled() )
								break;
							
							// Andere Aufgabe
						}
					}
					else
					{
						// Dem Server sagen:"Gib mir Daten von der DB"
					}
					
					moment.close();
					moment = null;

					if( listBedienerGruppe != null )
					{
						listBedienerGruppe.clear();
						listBedienerGruppe = null;
					}
					
					return null;
				}

	            // Durch publish() veröffentliche Zwischenergebnisse behandeln.
	            // process() wird innerhalb des EDT aufgerufen.
				// Hier können Manipulationen an GUI-Elementen sicher vorgenommen werden.
				@Override
				protected void process( List<String> chunks )
				{
					for (Object element : chunks)
						getModelBedienerUebernahme().addElement(element);
				}
				
				// Worker hat seinen Job beendet. done() wird innerhalb des EDT aufgerufen.
				// Hier können Manipulationen an GUI-Elementen sicher vorgenommen werden.
				@Override
				protected void done()
				{
					if( !isCancelled() )
					{
						....
					}
				}

			}.execute();

Gruß
Iron Monkey
 

Anhänge

  • SwingWorker.jpg
    SwingWorker.jpg
    34,8 KB · Aufrufe: 35

Marco13

Top Contributor
Falls es nur um den Thread geht: Die SwingWorker-Threads werden in einem Pool verwaltet, d.h. wenn man z.B. 2 SwingWorker startet, werden 2 Threads im Pool erzeugt (boah, ein Pool wär jetzt cool), und wenn sie Fertig sind, und man erzeugt danach nochmal 3 SwingWOrker, werden die 2 Thread vom Anfang "recyclet" und nur EIN neuer zusätzlich erstellt.
Diese Pool-Threads sterben nach einer gewissen Zeit, wenn sie nicht benutzt werden (eine Minute vielleicht? Könnte man im Quelltext nachsehen...)
 

Iron Monkey

Bekanntes Mitglied
OK, danke erstmal für die Info!

Es wird immer nur 1 Swingworker nach jedem Öffnen des Fensters gestartet.

So, und wenn ich das Fenster öffne, dann wird der Swingworker gestartet. Beim ersten Mal klappt es immer super: Daten über Server aus der DB holen und danach komplett in die Tabelle füllen!

Wenn ich aber das Fenster schliesse und das wieder öffne, dann wird der gleiche SwingWorker wieder gestartet. Beim 2. Mal wird das Holen der Daten über Server aus der DB auf einmal blockiert! Da dachte ich, es hat was mit dem SwingWorker zu tun. Es passiert immer wieder ab dem 2. Mal! Das ist genau das, was ich nicht verstehe! Der Code in der Methode "doInBackground" wird beim 2. Mal nicht vollständig durchgeführt, obwohl der gleiche Code beim 1. Mal super gut funktioniert. Das verstehe ich nicht!

Gruß
Iron Monkey
 

Marco13

Top Contributor
Ja, in dem Code ist ziemlich viel "..." weggelassen, und bei einer DB-Verbindung wird man wohl kein KSKB basteln können, aber ... vielleicht kannst du das ganze ja mal im Debugger starten, um zu sehen, wo genau er hängt... Keine Fehlermeldung und so?
 
S

SlaterB

Gast
> Der Code in der Methode "doInBackground" wird beim 2. Mal nicht vollständig durchgeführt

jeder kompliziere Code ist von Natur aus schlecht für irgendwelche Aussagen,
baue in die Methode allein
> System.out.println("Methode läuft");
wenn das zweimal klappt, dann besteht beim Swingworker kein Problem,

noch ein Test:
führe die Methode zweimal direkt aus main oder aus einem ActionListener heraus aus, die GUI darf für den Test ruhig solange blockieren,
wichtige Meldungen testweise sowieso immer mit System.out.println ;)

wenn das auch so zweimal nicht klappt und der SwingWorker unschuldig ist, dann machst du in deinem Code irgendwas fatales,
z.B. hast du
> moment.close();
vielleicht schließt das irgendeine übergeordnete Verbindung, die dann beim zweiten Durchlauf immer noch geschlossen ist
 

Iron Monkey

Bekanntes Mitglied
> Der Code in der Methode "doInBackground" wird beim 2. Mal nicht vollständig durchgeführt

jeder kompliziere Code ist von Natur aus schlecht für irgendwelche Aussagen,
baue in die Methode allein
> System.out.println("Methode läuft");
wenn das zweimal klappt, dann besteht beim Swingworker kein Problem,

noch ein Test:
führe die Methode zweimal direkt aus main oder aus einem ActionListener heraus aus, die GUI darf für den Test ruhig solange blockieren,
wichtige Meldungen testweise sowieso immer mit System.out.println ;)

wenn das auch so zweimal nicht klappt und der SwingWorker unschuldig ist, dann machst du in deinem Code irgendwas fatales,
z.B. hast du
> moment.close();
vielleicht schließt das irgendeine übergeordnete Verbindung, die dann beim zweiten Durchlauf immer noch geschlossen ist


Jetzt habe ich gerade beim Debuggen Schritt für Schritt geprüft und stelle fest, dass in der Methode "doInBackground()" beim Vector-Füllen ein heimliches Exception von FutureTask.class geworfen wurde und ab der Zeile wird es sofort blockiert ( also unendliche Schleife )! Das würde bedeuten, dass das Füllen ins Vector NICHT in doInBackground() durchgeführt werden darf. Ist das richtig?



Schau mal hier:

FutureTask.class
Java:
        void innerRun() {
            if (!compareAndSetState(0, RUNNING))
                return;
            try {
                runner = Thread.currentThread();
                if (getState() == RUNNING) // recheck after setting thread
                    innerSet(callable.call());
                else
                    releaseShared(0); // cancel
            } catch (Throwable ex) {     // <-------------------------------------- EXCEPTION GEWORFEN !!
                innerSetException(ex);
            }
        }

Dann geht der zu innerSetException und da sehe ich eine unendliche Schleife:

FutureTask$Sync.class
Java:
void innerSetException(Throwable t) {
	    for (;;) {
		int s = getState();
		if (s == RAN)
		    return;
                if (s == CANCELLED) {
		    // aggressively release to set runner to null,
		    // in case we are racing with a cancel request
		    // that will try to interrupt runner
                    releaseShared(0);
                    return;
                }
		if (compareAndSetState(s, RAN)) {
                    exception = t;
                    result = null;
                    releaseShared(0);
                    done();
		    return;
                }
	    }
        }

Gruß
Iron Monkey
 
S

SlaterB

Gast
tja, in dieser unendlichen Schleife stehen auch ein paar return, die kann also schon abgebrochen werden,
sollte da tatsächlich ein Bug in so einer oft genutzten Klasse vorhanden sein?
schwer zu glauben

> Das würde bedeuten, dass das Füllen ins Vector NICHT in doInBackground() durchgeführt werden darf. Ist das richtig?

so gesehen dürftest du überhaupt keinen Code da haben, denn überall kann doch eine Exception auftreten,
gehe der Exception auf den Grund und entferne sie

allgemein könntest du zur Sicherheit in deinem Code selber ein try/ catch setzen,
damit ja keine Exception zur FutureTask.class durchkommt
 

ymene

Bekanntes Mitglied
SwingWorker schlucken gern mal die ein oder andere Exception. Um wirklich rauszufinden, welcher Fehler aufgetreten ist, kann man hierfür die get() Methode des Swingworkers im done()-Block aufrufen. Das rauszufinden hat mich auch schon die ein oder andere schlaflose Nacht gekostet.

Eine gute Erläuterung wie ich fand gibt es von Jonathan Giles.
 

Iron Monkey

Bekanntes Mitglied
OK, ich danke euch erstmal!

Ich habe endlich den Fehler gefunden, was von mir auch total blöd war! Ich habe eine statische Vector-Variable deklariert und beim Schliessen lösche ich diese statische Variable mit null! Und beim 2. Aufruf bricht deswegen die Methode "doInBackground" ab und geht dann direkt zu der Methode "done()"! Es war ein NullPointerException!

Es hat sich jetzt erledigt und es funktioniert einwandfrei! :)

Gruß
Iron Monkey
 

Iron Monkey

Bekanntes Mitglied
SwingWorker schlucken gern mal die ein oder andere Exception. Um wirklich rauszufinden, welcher Fehler aufgetreten ist, kann man hierfür die get() Methode des Swingworkers im done()-Block aufrufen. Das rauszufinden hat mich auch schon die ein oder andere schlaflose Nacht gekostet.

Eine gute Erläuterung wie ich fand gibt es von Jonathan Giles.

Ja stimmt, da hast du recht! Dieser Fehler hat für mich auch eine sclaflose Nacht gekostet, aber aus Fehler lernt man was und beim nächsten Mal kommt das nie wieder vor! ;)

Gruß
Iron Monkey
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 8
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
E Button verschwindet nachdem ein Rechteck gezeichnet wurde AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
A Swing Koordinatensystem wird gezeichnet verschwindet aber und die Einteilungen bleiben nicht bestehen AWT, Swing, JavaFX & SWT 5
R TriangleMesh verschwindet teilweise beim resizen des Frames, sowie beim rotieren? AWT, Swing, JavaFX & SWT 1
T AWT JTextfield verschwindet AWT, Swing, JavaFX & SWT 10
S LayoutManager TextField verschwindet / wird klein AWT, Swing, JavaFX & SWT 4
D Swing JOptionPane verschwindet beim 2. Aufruf einfach so?? AWT, Swing, JavaFX & SWT 2
J JPanel verschwindet... AWT, Swing, JavaFX & SWT 8
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
frankred Swing JMenu verschwindet nicht beim klicken ausserhalb des JMenu! AWT, Swing, JavaFX & SWT 4
P Swing Jtable mit Delete Button (Button verschwindet nicht bei Delete)) AWT, Swing, JavaFX & SWT 5
G Menü verschwindet durch .setText() AWT, Swing, JavaFX & SWT 4
J JTextArea verschwindet bei resize vom JFrame AWT, Swing, JavaFX & SWT 2
N JMenuBar verschwindet nicht nach ComponentEvent AWT, Swing, JavaFX & SWT 6
K 2D-Grafik Linie verschwindet beim Zeichnen AWT, Swing, JavaFX & SWT 10
S JCheckBoxMenuItem - Haekchen verschwindet bei Icon AWT, Swing, JavaFX & SWT 3
S Beim Painten auf JPanel verschwindet das Bild :( AWT, Swing, JavaFX & SWT 10
O JPanel Zeichnung verschwindet AWT, Swing, JavaFX & SWT 4
F Zeichnung verschwindet bei Nutzung von einem Layout AWT, Swing, JavaFX & SWT 6
R JTable Headerbeschriftung verschwindet AWT, Swing, JavaFX & SWT 3
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
R Panel verschwindet AWT, Swing, JavaFX & SWT 2
P JTextArea text verschwindet bei mausklick AWT, Swing, JavaFX & SWT 5
R Bei JDialog verschwindet der Inhalt aus übergeordneten Frame AWT, Swing, JavaFX & SWT 2
X Durch DrawLine verschwindet das Fenster und die Objekte AWT, Swing, JavaFX & SWT 13
G Zeichnung verschwindet nach verändern der Fenstergröße. AWT, Swing, JavaFX & SWT 2
N WindowsLookAndFeel>JFrame/JDialogTitelleiste verschwindet AWT, Swing, JavaFX & SWT 4
K Zeichnung verschwindet. AWT, Swing, JavaFX & SWT 21
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
C Menue verschwindet hinter AWT-List Box.wie beheben? AWT, Swing, JavaFX & SWT 3
M JMenu verschwindet unter ScrollPane AWT, Swing, JavaFX & SWT 3
G wie verschwindet Konsole? AWT, Swing, JavaFX & SWT 3
V JDialog "verschwindet" beim umschalten in der Task AWT, Swing, JavaFX & SWT 9
R JFrame verschwindet sofort hiner dem Hauptframe AWT, Swing, JavaFX & SWT 9
M Menüleiste verschwindet AWT, Swing, JavaFX & SWT 6
H Hintergrundbild im Panel verschwindet sofort AWT, Swing, JavaFX & SWT 6
I Swing: Menü verschwindet beim Einfügen eines Bildes AWT, Swing, JavaFX & SWT 15
D DropDownSelection Box verschwindet hinter JTextArea AWT, Swing, JavaFX & SWT 2
Z bei kleinen Buttons verschwindet Schrift, obwohl Platz wäre AWT, Swing, JavaFX & SWT 5
F JavaFX Per Jpacke erstellte exe startet nicht AWT, Swing, JavaFX & SWT 5
Juelin Text und Backgroundcolor im Label geht nicht AWT, Swing, JavaFX & SWT 7
richis-fragen Spaltenbreite bei drag nicht änderbar AWT, Swing, JavaFX & SWT 4
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben