Le bloc finally est exécuté si le thread qui exécute la fonction est interrompue?
Si j'ai une fonction avec un try/finally section, et le thread en cours d'exécution, il est interrompu alors que dans le bloc try, le bloc finally exécuter avant l'interruption se produit réellement?
- stackoverflow.com/questions/4371560/...
- Vous devriez clair jusqu'à ce que vous entendez par "interrompue" - ce mot est en surcharge 🙁 Il signifie différentes choses pour firmware/driver les développeurs, les OS, les développeurs et les développeurs java.
- Eh bien, j'ai marqué à la question "java", et je l'ai mentionné essayer/pour finir, alors j'ai pensé que l'on peut comprendre que je parle d'interrompre les threads en Java...
Vous devez vous connecter pour publier un commentaire.
Selon les Tutoriels Java, "si le thread exécutant la
try
oucatch
code est interrompu ou tué, lefinally
bloc ne peut pas exécuter même si l'application continue."Voici le plein passage:
...
Il imprime - finalement exécuté
Interrompre un Thread en Java est juste un indicateur. Il ne cause pas de quelque chose de spécial pour arriver à code en cours d'exécution, ou qui affectent le flux de contrôle.
Si votre fil est engagée dans, ou tente de pénétrer, une opération qui throws InterruptedException, alors, l'exception est levée à partir du point où cette méthode est invoquée et si c'est à l'intérieur d'un bloc try, le va finalement s'exécuter avant l'exception des feuilles, tout comme normale.
Beaucoup de Oracle Java tutoriels sont utiles (j'ai des réponses de référencement des blocs protégés de la page et le SAX introduction), mais ils ne sont pas nécessairement autoritaire, et certains d'entre eux ont des erreurs ou sont incomplets. La citation référencée dans la question débordait d'interruption avec la JVM de quitter, ce qui est source de confusion.
D'abord, le fil de l'interruption de l'Java n'a rien à voir avec les OS au niveau des interruptions. Le partage d'un nom crée des opportunités pour la confusion, mais il n'y a pas de connexion.
Prochaine, JVM sortie évidemment tue le fil sans la possibilité de faire tout le nettoyage. Si le processus meurt avant que le thread a été aussi loin que le bloc finally, trop mauvais. Mais il n'y a pas de comparaison à l'interruption. Rien sur l'interruption empêche enfin de blocs à partir de la fin.
Un principe de conception de l'interruption est qu'en agissant sur l'interruption nécessite la coopération de la thread d'être interrompu. Le fil interrompu répond à sa discrétion, l'interruption de ne pas contraindre le thread pour faire quoi que ce soit. Tous les Thread appelant#interrupt() n'est de définir un indicateur sur le fil. Le blocage des méthodes comme l'attente du sommeil ou de vérifier le drapeau pour voir si elles doivent se réveiller tôt. (InterruptedException est un checked exception de sorte que vous pouvez dire qui le jette quand, et votre Praticable peuvent s'y préparer.) Aussi importe quel code peut utiliser le Thread#isInterrupted() pour vérifier si son thread a eu le drapeau.
Lorsque le Thread#sleep() reconnaît l'interruption du drapeau est réglé, il efface le drapeau avant de jeter InterruptedException. Lorsque votre thread attrape une InterruptedException il est de bon ton de restaurer l'indicateur à l'aide de Fil.currentThread().interrupt(), juste au cas où il y a un autre code qui s'exécute dans le thread qui a besoin de savoir à propos de l'interruption. Ceci entre dans le jeu quand vous avez plus de situations complexes avec imbriqué synchroniseurs où, par exemple, certains sont profondément imbriqués composant pouvait avoir son sommeil interrompu, laisser rester effacé pourrait prévenir les couches supérieures de connaître l'interruption. Dans un jouet simple exemple comme ceux en d'autres réponses ici, il n'a pas d'importance si le drapeau est restauré ou pas, rien ne le vérifie à nouveau et le thread se termine.
Dans le commentaires à la réponse, @Risadinha demandé très valide question de savoir si le code dans
finally
bloc sera exécuté si nous restaurer interruption drapeau à l'intérieurcatch
bloc en appelantThread.currentThread().interrupt()
.Voici petit extrait de code de test:
SomeContext code de classe:
L'effet de l'interruption est de jeter un
InterruptedException
la prochaine fois qu'une opération de blocage se produit (dans la pratique, la prochaine fois qu'une méthode est appelée, qui précise qu'il peut jeter uneInterruptedException
), à quel point, comme d'habitude, la normaletry/catch
flux d'exécution est suivie, qui ne fait exécuter lafinally
bloc après letry
et de toutes lescatch
es.Il exécutera la même façon qu'avec toute autre exception du bloc try, pas avant l'interruption.