Pourquoi ne Thread.isInterrupted () retourne toujours faux?
J'ai trouvé la méthode de JavaDoc:
Retourne:
vrai si le thread a été interrompu; false dans le cas contraire.
Je pense que quelque chose de mal avec ma compréhension de la méthode. De plus, on peut mal comprendre le concept "d'interruption" dans le Fil de discussion.
Toute explication est la bienvenue! Merci!!!!
Extrait de Code:
Dans le thread définition:
public void run() {
try {
//Do something
} catch (InterruptedException e) {
System.out.println(isInterrupted());//Always false
return;
}
}
invoquer:
theThread.interrupt();
Vous devez vous connecter pour publier un commentaire.
Une fois que l'exception est levée, le thread n'est plus à une interruption de l'etat.
InterruptedException
pourrait être renvoyée par du code. La javadoc reconnaît explicitement et montre la "bonne façon" de faire; voir la citation dans ma réponse.isInterrupted()
renvoie la valeur false à l'intérieur du bloc catch. Je crois que ma réponse est suffisant pour cette question qui a été posée.Ce comportement est généralement documenté dans les méthodes que jeter de cette exception. Par exemple, la javadoc de
Object.wait()
dit:En effet, la javadoc de l'exception elle-même dit ceci:
Notez comment ils souligner que le drapeau devrait être désactivée avant de l'exception est levée.
Pourquoi il a été conçu pour fonctionner comme cela? Vous devriez demander à des designers, mais je pense qu'ils ont compris qu'un gestionnaire d'exception devrait poignée la situation, et qu'il ne devrait donc pas être nécessaire pour le drapeau à toujours être réglé à ce point. (Si le gestionnaire n'est pas entièrement gérer la situation, elle peut, soit renvoyer l'exception, ou appelez
Thread.getCurrentThread.interrupt()
définir l'indicateur de nouveau.)Ajoutant à cdhowie réponse, un modèle standard est de laisser le Fil gérer l'interruption. Cette option est utile de Les exécuteurs, lorsque l'exécution de code n'est pas "propre" le Fil et ne devrait pas obtenir de la manière de l'interruption (sauf si vous savez vraiment ce que vous faites)
Vous serait de vérifier isInterrupted() dans votre code, par exemple à partir d'une boucle. Si le thread a été interrompu, vous pouvez alors jeter InterruptedException pour arrêter l'exécution.
Dans votre exemple, si vous avez pris InterruptedException vous pouvez être sûr qu'il a été interrompu et que vous n'avez pas à vérifier que la méthode.