Warum stoppt SwingWorker unerwartet?

8

Ich wollte einige Ideen mit SwingWorker ausprobieren, da ich es nicht zu oft benutzt habe. Stattdessen stieß ich auf ein Problem und ich kann nicht herausfinden, was falsch ist.

Hier ist eine kurze SSCCE , die dieses Problem demonstriert (ich kenne Leute wie SSCCEs):

%Vor%

Also sollte mein Programm 3 SwingWorker erstellen, die eine Zeile auf dem Bildschirm ausgeben und dann für die angegebene Anzahl von Millisekunden schlafen und dann die Zeile erneut ausdrucken und wieder einschlafen usw. Ich erstelle die SwingWorker s aus dem Thread von Swing, weil sie sonst würde nicht einmal anfangen.

Also ist die erwartete Ausgabe:

%Vor%

usw. für insgesamt 150 Zeilen (3 Worker x 50 Iterationen für jeden)

Stattdessen ist die Ausgabe, die ich bekomme:

%Vor%

Und das ist es. Nur 3 Zeilen. Danach wird das Programm beendet. Von diesem try catch -Block gibt es keinen StackTrace.

1). Wo ist der Arbeiter mit den 1200ms Schlaf? Wenn ich 1200ms durch 1000ms ersetze, dann druckt dieser Arbeiter auch 1 Zeile ... ja, nur einen. Seltsam ...

2). Warum hören die Arbeiter auf? (und ich bekomme keine 150 Zeilen Zeug)

Ich habe dieses Programm mit JRE 7 Update 11 unter Windows 7 64-bit ausgeführt.

PS: Ich bin mir ziemlich sicher, dass der hier erwähnte Fehler in dieser Version von JRE behoben wurde, da ich es tue Erhalte 2 unterschiedliche Werte (15 und 16) als Thread-IDs, die auf der Konsole gedruckt werden. Das war das erste, was ich vermutete.

    
Radu Murzea 15.02.2013, 18:05
quelle

4 Antworten

9

Ich glaube, dass Sie ein visualisiertes Swing-Top-Level-Fenster zeigen müssen, um den Swing-Ereignis-Thread lebendig zu halten. Andernfalls wird das Programm wegen fehlender Nicht-Daemon-Threads heruntergefahren.

Bearbeiten:
Um zu beweisen, dass der SwingWorker-Thread ein Daemon-Thread ist, fügen Sie einfach eine Codezeile hinzu, um ihn zu testen:

%Vor%     
Hovercraft Full Of Eels 15.02.2013, 18:10
quelle
9

Wenn Sie Zeile 771 des SwingWorker-Klassenquellcodes (Java SE 7) betrachten:

%Vor%

Sie werden sehen, dass SwingWorker in einem Daemon-Thread ausgeführt wird, und in Java wird die JVM beendet, wenn alle Nicht-Daemon-Threads beendet sind.

    
Eng.Fouad 15.02.2013 18:21
quelle
4

Wie bereits erwähnt, können Sie die Benutzeroberfläche verwenden, um die Threads am Leben zu erhalten.

Alternativ können Sie SwingWorker#get (oder alles, was verhindert, dass der Haupt-Thread beendet wird) auf das Ende der Threads warten. Auf diese Weise erhalten Sie die Ausgabe wie erwartet. Hier ist der modifizierte Code, der das macht, was Sie wollen.

%Vor%     
Ankit 15.02.2013 18:27
quelle
3

Haben Sie versucht, eine Benutzeroberfläche zu erstellen? oder etwas wie new Object().wait(); am Ende von main setzen, um zu verhindern, dass der Haupt-Thread beendet wird?

Ich bin nicht völlig sicher , dass dies der Fall ist, aber ohne tatsächliche Benutzeroberfläche zeigt, bin ich ziemlich sicher, dass die Swing Worker nur ein weiterer Thread sind, und Sie haben keine als konfiguriert Daemon-Threads, also Main startet sie, Hauptbeendigungen, und der Prozess endet?

    
John Gardner 15.02.2013 18:11
quelle