Méthodes qui effacent le drapeau Thread.interrupt ()
J'ai récemment hérité d'une large Application Java qui n'a presque pas de Fil de sécurité. Ce que je suis en train de travailler sur l'obtention de tous les Threads pour gérer correctement d'être interrompu au lieu d'utiliser la très mauvaise Thread.stop()
.
Une partie du problème est que je ne sais pas à chaque appel de méthode qui efface le drapeau d'interruption.
Actuellement, je sais que la suite sera clairement l'interruption indicateur:
Thread.interrupted()
Thread.sleep(long)
Thread.join()
Thread.join(long)
Object.wait()
Object.wait(long)
Quoi d'autre ai-je raté? Merci
source d'informationauteur OverflowingStack
Vous devez vous connecter pour publier un commentaire.
Il est important de préciser que les méthodes suivantes clair que l'interruption du pavillon simplement en les appelant:
Pour cette raison
Thread.currentThread().isInterrupted()
doit toujours être utilisée à la place.Les méthodes suivantes pour effacer l'interruption du pavillon par immédiatement jeter
InterruptedException
soit si ils ont été appelés et puis le thread a été interrompu ou si le thread a été déjà interrompue, et puis ils ont été appelés (voir junit code ci-dessous). Ce n'est pas la méthode qui efface le drapeau, en jetant l'exception ne.Veuillez noter que le bon modèle avec tout code qui attire
InterruptedException
est immédiatement re-interrompre le fil. Nous faisons cela dans le cas où d'autres s'appuient sur lethread.isInterrupted()
méthode:JUnit code qui montre une partie de cette:
Convention commune est la suivante: toute méthode qui jette
InterruptedException
(+Thread.interrupted()
) efface le drapeau d'interruption.Afin de faire de votre fils interruptable vous avez besoin de trouver tous les endroits où
InterruptedException
se fait prendre sans retrowing ou la restauration de l'interruption du pavillon. DepuisInterruptedException
est un checked exception il n'est pas difficile à faire.Voici un SUPER FUN EXEMPLE:
ch.la qualité de service.logback.de base.AsyncAppenderBase avant la version 1.1.4 les captures et les hirondelles InterruptedException sans réinitialisation de l'indicateur sur le fil.
Donc, si vous utiliser quoi que ce soit sur les routes à cet enregistreur (comme slf4j), il en silence manger votre fil d'interruption d'état. Parce que, je veux dire, qui ne contrôle pas le fil d'interruption avant et après chaque opération de journal?