Je sais que finalement les blocs des fils de Damon ne seraient pas exécutés. Mais ma nature méticuleuse tente de comprendre pourquoi et que se passe-t-il dans JVM si spécial qu'il ne pouvait pas appeler le code sous ce bloc. p>
Je pense que cela est associé à une pile d'appels qu'il ne voudrait pas se détendre, mais je ne sais pas comment. Quelqu'un peut-il faire une lumière à ce sujet. Merci. P>
3 Réponses :
Qui dit que Ce que vous pourrait em> avez entendu dire qu'un bloc Mais encore une fois: Pendant le fonctionnement normal, il n'y a plus rien em> qui arrête enfin code> des blocs d'exécution normalement dans les threads de démon: ils sont pas em> manipulés différemment . P>
Le problème d'arrêt est facile: lorsque le JVM est invité à éteindre ou même forcé de fermer, il peut simplement ne pas être capable em> pour exécuter plus de déclarations. P>
Par exemple, sur les systèmes d'exploitation POSIX-Y, SIGNAL 9 (SIGKILL) enfin code> Les blocs des threads de démon ne sont pas exécutés? C'est
enfin code> n'est pas garanti d'être exécuté lors de l'arrêt de JVM lors de l'exécution du
Essayez code > (ou
attrape code>) bloc. C'est correct (et cela peut facilement arriver aux fils de démon). P>
enfin code>, car le système d'exploitation ne le laissera plus courir. P>
Concernant la dernière sentance. Cela signifie-t-il non seulement des fils de démon, mais tous les threads dans ce cas ne peuvent-ils pas exécuter finalement la clause?
Oui, vous ne pouvez pas vous attendre à ce que aucun code spécifique soit exécuté dans ces cas. Il ressort de la similarité de Turbibg de l'ordinateur (sauf bien sûr, cela n'affecte qu'un processus).
Si le code JVM sort pendant l'exécution du code d'essai ou de capture est exécuté , alors le bloc enfin peut ne pas exécuter.
arrêt normal - Cela se produit soit lorsque le dernier non-démon Sortie de fil ou lors de l'exécution.exit ()
Lorsqu'un thread sort, le JVM effectue un inventaire des filets exécutants et si les seuls threads qui Sont laissés sont des threads de démon, il initie une fermeture ordonnée. Lorsque le JVM s'arrête, tous les fils de démon restants sont abandonnés Enfin, les blocs ne sont pas exécutés, des piles ne sont pas déroulées que la JVM vient de sortir. Les fils de démon doivent être utilisés avec parcimonie peu d'activités de traitement peuvent être abandonnées en toute sécurité à tout moment sans nettoyage. En particulier, il est dangereux d'utiliser des threads de démon pour des tâches pouvant effectuer une sorte d'E / S. Les fils de démon sont mieux sauvegardés pour les tâches "ménagers", telles qu'un fil d'arrière-plan qui supprime périodiquement les entrées expirées à partir d'un cache en mémoire.
Dernier thread Thread Exemple: P>
Is alive Is alive Is alive Is alive Is alive Is alive Is alive Is alive Is alive Is alive Last non-daemon thread exits. Is alive Is alive Is alive Is alive Is alive
J'ai créé deux filets non-daemon qui se termineront avant les deux fils de Daemon Repos.
Un fil non-Daemon attend 20 sec, Un fil de démon attend pendant 40 secondes, un filetage non-démon sommeil pendant 15 secondes, un fil de démon dormir pendant 30 secondes, Un fil de démon dormir pendant 10 secondes. L'idée de mettre fin à des fils non-daemon avant certains démon. P>
Comme le suggère le suggère, la JVM se terminera dès qu'il n'y a pas de filetage non-Daemon vivant, sans exécuter les déclarations de repos dans les tâches runnables des threads du démon, même s'ils sont à l'intérieur, bloquent enfin sans lancer une interruptionException. p>
Pas vraiment une duplication exacte, mais très b> liée: enfin Le bloc est toujours exécuté?