Warum Thread.currentThread (). isInterrupted () anstelle von isInterrupted () verwenden?

8

Ich habe eine Frage bezüglich der Implementierung einer Stornierungsrichtlinie für eine Thread-Unterklasse. Es scheint üblich zu sein, es so zu machen:

%Vor%

Die Frage, die ich habe, bezieht sich auf Thread.currentThread () ... Warum ist es üblich, currentThread () zu verwenden, um das Unterbrechungsflag zu überprüfen, aber nicht, es in der cancel () -Methode zu setzen? Wäre es nicht ausreichend, einfach die Methode isInterrupted () von A wie folgt aufzurufen:

%Vor%

Ich konnte weder im Thread JavaDoc noch in Brian Goetz 'hervorragendem Buch über gleichzeitiges Java oder stack overflow eine Antwort finden.

Vielen Dank im Voraus für Ihre Einsichten!

Prost, Georg

    
BumbleGee 27.07.2012, 07:03
quelle

4 Antworten

16

In Ihrem Fall genügt es, !isInterrupted() aufzurufen, weil Sie von der Klasse Thread ausgehen. Normalerweise dehnen Sie nicht von Thread aus - deshalb rufen Sie Thread.currentThread() auf.

    
Andrey Borisov 27.07.2012, 07:05
quelle
4

Ausgehend von Java 5 ist es keine gute Idee, direkt mit Threads zu arbeiten . Sie sollten stattdessen das Executor-Framework verwenden und je nach Ihren Anforderungen eine Ausführungsrichtlinie auswählen. Die Instanz isInterrupted() -Methode testet, ob dieser Thread unterbrochen wurde. Der unterbrochene Status des Threads ist von dieser Methode nicht betroffen. Die innere isInterrupted() ist eigentlich eine native Methode.

%Vor%

Bei der Verwendung des Executor-Frameworks wissen Sie nicht, welche Thread-Instanz gerade Ihren Code ausführt, daher lautet die Konvention Thread.currentThread.isInterrupted ()

    
Geek 27.07.2012 07:44
quelle
2

Das cancel ist klar: Es leitet den Aufruf effektiv an this.interrupt ; die Thread-Instanz, auf die die cancel -Methode angewendet wird.

Wie bei der Methode run ist alles, was Sie angeben, sinnvoll, wenn man annimmt, dass die Methode run tatsächlich von der (erwarteten) Instanz von class A aufgerufen und nur aufgerufen wurde. Während das wahrscheinlich eine sichere Annahme ist, ist es allgemein wahr? Nun, wenn Sie mich nach einem aussagekräftigen Beispiel dafür fragen, wie / wann diese Annahme verletzt werden könnte, ich bin mir nicht sicher, ob ich das so spät in der Nacht aus meinem Hut ziehen kann: -)

>

Betrachten Sie eine andere Methode als run . Wenn es eine Methode auf class A ist, sollte sie davon ausgehen, dass sie von / auf demselben Thread aufgerufen wird? Vielleicht ist es eine Methode in einer anderen Klasse. Es scheint also wahrscheinlich, dass dies nur eine Best-Practice-Methode ist, um potenzielle Bugs zu eliminieren: Ihr Code wird kopier- und pastensicher [@Thomas hat diese Einsicht auch gemacht]

    
Richard Sitze 27.07.2012 07:15
quelle
1

Es sollte gleich sein, wenn dieser Code im gerade laufenden Thread ist. Vielleicht befürchten Autoren, dass jemand die run-Methode in einem anderen Thread ausführen wird, vielleicht wollen sie, dass es genauso aussieht wie anderswo. Oder sie kopieren es eingefügt und haben nicht gedacht.

    
Alpedar 27.07.2012 07:06
quelle