Pourquoi utiliser Thread.currentThread().isInterrupted() au lieu de isInterrupted()?
J'ai une question concernant la mise en œuvre d'une politique d'annulation pour une sous-classe de Thread. Il semble être une pratique courante de faire comme ceci:
class A extends Thread {
[...]
public final void run() {
try {
while(!Thread.currentThread().isInterrupted()) {
[...]
}
} catch (InterruptedException consumed) {
}
}
public final void cancel() {
interrupt();
}
}
La question que j'ai est sur le Fil.currentThread()... Pourquoi est-il courant d'utiliser currentThread() pour le contrôle de l'interruption de drapeau, mais pas pour le paramètre dans la méthode cancel ()? Ne serait-il pas suffisant de simplement appeler le isInterrupted() la méthode de l'Une comme ceci:
while (!isInterrupted()) {
[...]
}
Je n'ai pas trouvé de réponse ni dans le Fil JavaDoc, Brian Goetz' excellent livre sur simultanées Java ou stackoverflow.
Merci d'avance pour vos idées!
Cheers,
Georg
OriginalL'auteur BumbleGee | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
Dans votre cas, il est suffisant de simplement appeler
!isInterrupted()
parce que vous êtes s'étendant à partir de laThread
classe. En général, vous n'avez pas étendre à partir deThread
- c'est pourquoi vous appelezThread.currentThread()
.Peut-être que c'est juste une question de copier-coller ou constistency à travers les exemples. Je ne connais pas ce livre, mais si il y a des exemples d'utilisation de
Runnable
ainsi, alors je soupçonne que c'est l'un de ces deux, probablement le dernier.bon point, Thomas. Vous avez probablement raison
OriginalL'auteur Andrey Borisov
À partir de Java 5, il est pas une bonne idée de travailler avec des Fils directement . Vous devriez plutôt utiliser Exécuteur cadre et choisir une stratégie d'exécution en fonction de vos besoins . L'instance
isInterrupted()
méthode teste si ce thread a été interrompu. L'état d'interruption du fil n'est pas affectée par cette méthode.L'intérieurisInterrupted()
est en fait une méthode native .Alors que l'aide de l'exécuteur cadre vous ne savez pas quel thread instance est en cours d'exécution de votre code actuellement et, partant, la convention est d'utiliser Thread.currentThread.isInterrupted()
OriginalL'auteur Geek
La
cancel
est clair: c'est en effet de diriger l'appel àthis.interrupt
; je.e le Fil instance à laquelle lacancel
méthode est appliquée.Comme pour le
run
méthode, tout ce que vous de l'état du sens sur l'hypothèse que lerun
méthode a été effectivement appelé, et que, par l' (attendue) de l'instance declass A
. Alors que c'est probablement une hypothèse sûre, est-il toujours vrai? Maintenant, si vous allez pour me demander un exemple significatif de comment/quand cette hypothèse pourrait être violé, pas sûr que je peux tirer de mon chapeau, c'tard dans la nuit 🙂Envisager une autre méthode que
run
. Si c'est une méthode surclass A
faut-il supposer qu'il est appelé par/sur le même thread? C'est peut-être une méthode sur une autre classe. Il semble donc probable que c'est juste une des meilleures pratiques afin d'éliminer d'éventuels bugs: votre code devient copier/coller-la preuve [@Thomas fait cette idée ainsi]OriginalL'auteur Richard Sitze
Il doit être la même, SI ce code est dans le thread en cours d'exécution.
Peut-être que les auteurs de peur que quelqu'un va exécuter la méthode dans d'autres thread, peut-être qu'ils veulent paraître même que awerywhere d'autre.
Ou ils ont copier collé et ne pense pas.
OriginalL'auteur Alpedar