Pourquoi invoquer la méthode Thread.currentThread.interrupt()
dans le bloc catch?
la source
Pourquoi invoquer la méthode Thread.currentThread.interrupt()
dans le bloc catch?
Ceci est fait pour garder l'état .
Lorsque vous attrapez le InterruptException
et l'avalez, vous empêchez essentiellement les méthodes / groupes de threads de niveau supérieur de remarquer l'interruption. Ce qui peut poser des problèmes.
En appelant Thread.currentThread().interrupt()
, vous définissez l'indicateur d'interruption du thread, de sorte que les gestionnaires d'interruptions de niveau supérieur le remarqueront et pourront le gérer de manière appropriée.
Java Concurrency in Practice aborde ce sujet plus en détail au Chapitre 7.1.3: Répondre à une interruption . Sa règle est:
Seul le code qui implémente la politique d'interruption d'un thread peut avaler une demande d'interruption. Les tâches générales et le code de bibliothèque ne doivent jamais avaler les demandes d'interruption.
InterruptedException
statut d'interruption efface quand elle le fait. Je pense que cela rend la réponse plus claire en termes de pourquoi vous devez conserver l'état d'interruption.interrupt()
appel est le seul moyen de définir l'indicateur d'interruption une fois que vous avez reçu une notification concernant cet état via l'autre «mécanisme de livraison» - leInterruptedException
et que vous souhaitez ou ne pouvez pas le relancer.Je pense que cet exemple de code rend les choses un peu claires. La classe qui fait le travail:
La classe principale:
Essayez d'appeler l'interruption sans rétablir l'état.
la source
Remarque:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Comment arrêter un thread qui attend pendant de longues périodes (par exemple, pour une entrée)?
Cela garantit que le thread relèvera l'exception InterruptedException dès qu'il le pourra.
la source
Je considérerais cela comme une mauvaise pratique ou au moins un peu risquée. Habituellement, les méthodes de niveau supérieur n'effectuent pas d'opérations de blocage et elles ne verront jamais
InterruptedException
. Si vous le masquez à chaque endroit où vous effectuez une opération interruptible, vous ne l'obtiendrez jamais.La seule justification pour
Thread.currentThread.interrupt()
et ne pas déclencher une autre exception ou une demande d'interruption de signalisation d'une autre manière (par exemple, définirinterrupted
une variable de variable locale dans la boucle principale d'un thread) est la situation où vous ne pouvez vraiment rien faire avec l'exception, comme dans lesfinally
blocs.Voir la réponse de Péter Török, si vous voulez mieux comprendre les implications de l'
Thread.currentThread.interrupt()
appel.la source
Se référer à la documentation java
Donc, si vous changez la méthode sleepBabySleep () dans @Ajay George Answer to I / O operation ou juste un sysout, vous n'avez pas à redéfinir le statut pour arrêter le programme. (BTW, ils ne lancent même pas InterruptedException)
Tout comme @ Péter Török a dit => Ceci est fait pour garder l'état. (Et en particulier pour la méthode qui lancera InterruptedException)
la source