SwingWorker.cancle(true) tötet alle Worker

CHAOSFISCH

Bekanntes Mitglied
Servus,

ich hab einen ExecutorService in welchen max. 10 SwingWorker "passen".
Es werden nun eine Anzahl von 1-10 SwingWorker Objekte an den ExecutorService mit .submit() übergeben. Jetzt kann es sein, dass ein SwingWorker Objekt nicht mehr weiterlaufen soll - forced Abbruch durch Benutzer.

Versteh ich doch so richtig: Ich kann im SwingWorker selbst die Methode cancle() aufrufen, wodurch der Prozess sich tötet. Jetzt hat cancle allerdings noch ein boolean Parameter "interruptIfRunning".

Naja, also dachte ich: this.cancle(true) tötet den Thread halt direkt - macht es auch, aber alle anderen Worker im ExecutorService sterben dabei mit :O ?
Ist das das normale Verhalten?
Bei this.cancle(false) stirbt nur der gewollte Thread - jedoch mit ewiger Verzögerung weil eine Schleife im Programm blockt.

Was kann ich da machen?
Gruß
CHAOSFISCH
 
T

Thread

Gast
Ich hab mich zwar so noch nie dierekt mit dem SwingWorker befasst dafür aber schon ziemlich viel mit Threads.
Laut DOC löst cancel() (man sollte eine Methode schon richtig schreiben) scheinbar ein Thread.interrupt() aus (wenn der bool true ist) was bei "normalen" Threads dazu führt das die dadurch ausgelöste InterruptedException im Thread.UncaughtExceptionHandler gecatched und dadurch der Thread "terminated" wird. Zumindest soweit wie ich die DOC verstanden habe.

Um vielleicht mal andersrum anzufangen : du verwendest Threads. Und Threads sollte grundsätzlich NIE von außen "gewaltsam" abgebrochen werden. Dazu sollte innerhalb des Threads an gewissen Punkten immer mal wieder auf ein runtime-Flag geprüft werden was man von außen über einen Setter manipulieren kann. Das hat unter anderem die Auswirkung das man so dem Thread noch die Möglichkeit gibt seine Resourcen sauber aufzuräumen und korrekt zu terminieren. Das ist auch der Grund warum man Thread.destroy() und Thread.stop() NICHT zum terminieren eines Threads verwenden sollte.

Und da der Missbrauch vom ExceptionHandling zur Programmflusssteuerung (und nichts anderes wird hier mit SwingWorker.cancel() scheinbar gemacht) sollte man unbedingt vermeiden.

Wenn ich z.B. die InterruptedException innerhalb des Threads abfangen und "verschlucken" würde oder z.B. einen eigenen UncaughtExceptionHandler setze dann würde das cancel() schon garnicht mehr greifen weil es sich auf etwas verlässt was man "aushebeln" kann.


Kurz um : die "saubere" Art und Weise einen Thread von "außen" zu terminieren ist über das setzen eines runtime-Flags (gerade in Loops) und das regelmäßige Prüfen dieses Flags. Sollte der Thread in einer blocking-Method "klemmen" kann man so einfach nichts gegen machen.
 
Soweit ich weiß löst ein Thread.interrupt() aber nichts im UncaughtExceptionHandler aus. Es setzt lediglich ein Flag, dass über isInterrupted() abgerufen werden kann. Außer der Thread hängt an einem wait() oder join(), dann wird dies unterbrochen und eine InterruptedException geworfen. Der Code danach läuft aber weiter. Und dann, wie du schon gut gesagt hast, kommt die Saubere Art zum Einsatz. Wenn eh schon ne while-Schleife vorhanden ist, die den Thread blockiert ist es ja perfekt, kann man jede runde mit Thread.currentThread().isInterrupted() nachprüfen.

Ich bin mir nicht sicher warum bei cancel(false) der Thread stirbt, aber ich kenn den sourcecode der Methode cancel nicht. Wenn das wirklich nur ein Thread.interrupt() ist, dann beendet es den Thread nicht. Dann kann er höchstens selber terminieren.
 

CHAOSFISCH

Bekanntes Mitglied
Danke für die Antworten.
Ich hab jetzt mit 2 Flags (interner Stop, externer Stop gearbeitet - wichtig für den Programmfluss)
Die Flags hatten jedoch nicht das Problem behoben, dass dann plötzlich alle Worker-Objekte gestoppt haben.

Der Fehler hierzu lag im fehlerhaften Event-Handling. Der gestoppte Worker sendet das Event "gestoppt" aus, dieses wurde dann falsch verarbeitet, wodurch die anderen Worker ebenfalls stoppten. Es fehlte eine simpler condition check mit if.
Daher ist auch die Aussage falsch, dass cancle() schuld ist.

cancle(true) - stoppt sofort, bzw. cancle(false) - stoppt sofort wenn möglich, töten nicht alle Worker im ExecutorService.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Alternative für SwingWorker Allgemeine Java-Themen 5
Thallius Merkwürdiges Verhalten von Swingworker.cancel() Allgemeine Java-Themen 2
U SwingWorker und Exception Allgemeine Java-Themen 3
martin82 Java Runtime Update >17 - SwingWorker Änderungen? Allgemeine Java-Themen 7
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
D SwingWorker, was ist richtig? Allgemeine Java-Themen 2
T SwingWorker mit mp3 Datei? Allgemeine Java-Themen 5
M True or false Verständnis Allgemeine Java-Themen 5
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
GilbertGrape Warum macht man "if(true)" Allgemeine Java-Themen 18
S isDirectory() bei Dateien manchmal true Allgemeine Java-Themen 6
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
D Wie fragt man Booleans auf true oder false ab? Allgemeine Java-Themen 18
J Konsolen Anwendung mit while(true) Allgemeine Java-Themen 6
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
B Window.setAlwaysOnTop(true) - Fokusverlust Allgemeine Java-Themen 4
ARadauer zuweisung ergibt doch true, oder? Allgemeine Java-Themen 17
F While(true)-Schleife im JPanel Allgemeine Java-Themen 9
H ganze zahl true / false Allgemeine Java-Themen 3
N Bekomme NIE ein TRUE obwohl ich es bekommen müsste :( Allgemeine Java-Themen 10

Ähnliche Java Themen


Oben