SwingWorker.cancel, Unterschied zwischen true und false als Paramter?

DarthShader

Erfahrenes Mitglied
Hallo,

ich nutze oft den SwingWorker, um Aufgaben im Hintergrund zu erledigen. Ich bin nun zum ersten mal damit konfrontiert, den SwingWorker abzubrechen. Das Abbrechen eines Threads ist ja ne eigene Wissenschaft für sich ;)

Meine Frage ist sehr simpel: es gibt ja die Methode "SwingWorker.cancel( mayInterruptIfRunning )".

Kann mir jemand den Unterschied erklären zwischen "cancel(true)" und "cancel(false)"? Ich verstehe die Erklärungen in den Dokus dazu einfach nicht.

Vielen Dank!
 
Der Task läuft ja in einem eigenen Thread ab. Ein Thread interrupt unterbricht die Ausführung des Threads, egal was dieser gerade tut. Wenn mayInterrupt also auf true steht, dann wird ein interrupt an den Thread gesendet. Wenn dies auf false steht wird das cancel erst beim nächsten Schleifendurchlauf geprüft wie an dem Beispiel aus der Doku zu sehen:

Java:
 @Override
     public List<Integer> doInBackground() {
         while (! enough && ! isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }
 
Hallo,

vielen Dank für Deine Antwort, ich denke ich verstehe es jetzt. Nur noch mal rekapituliert:

Der Task läuft ja in einem eigenen Thread ab. Ein Thread interrupt unterbricht die Ausführung des Threads, egal was dieser gerade tut.

"Egal was dieser gerade tut" ist glaube ich so nicht ganz richtig oder mißverständlich. Wenn ich die ganze Sache richtig verstehe, dann wird eine Interrupted-Exception geworfen im Thread, aber nur wenn z.B. gerade Thread.sleep ausgerührt wird (weshalb man die Exception ja auch behandeln muss). Wenn man SwingWorker.cancel( false ) macht, wird bei Thread.sleep nicht interupted, und man kann den Thread lediglich "maunell" beenden indem man auf "isCancelled" prüft.

So korrekt?
 
Man kann sich das folgendermaßen erklären:

wenn auf einem Thread die Methode interrupt() (was gleichbedeutend mit der cancel()-Methode des Swingworkers ist) aufgerufen wird, dann wird erstmal nur eine Art Flag gesetzt, und der Thread befindet sich in einem bestimmten Status (die Methode isInterrupted() liefert nun true zurück). Es liegt aber bei dem Code (also bei der Implementierung von run()) ob dieses Flag ausgewertet wird.

Korrekt ist: es gibt Methoden wie sleep() oder wait() die auf das Setzen dieses Flags reagieren. Man erkennt sie daran, dass sie eine InteruptedException werfen.

Ob der Thread beim Auslösen dieser Exception auch wirklich beendet wird, hängt aber auch von der Fehlerbehandlung in dem Thread ab.

So wird sich folgender Thread nicht einfach oder wahrscheinlich gar nicht von außen beenden lassen:

Code:
while (true) {
            try {
                Thread.currentThread().sleep(10);
            } catch (InterruptedException e) {
                continue;
            }
        }

Die Bedeutung von "mayInterruptIfRunning" kann man gut in der Doku nachlesen: If the task has already started, then the mayInterruptIfRunning parameter determines whether the thread executing this task should be interrupted in an attempt to stop the task.
 

Neue Beiträge

Zurück