8
votes

enfin bloquer dans le fil de démon

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.

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.


1 commentaires

Pas vraiment une duplication exacte, mais très liée: enfin Le bloc est toujours exécuté?


3 Réponses :


11
votes

Qui dit que enfin Les blocs des threads de démon ne sont pas exécutés? C'est pas vrai en général.

Ce que vous pourrait avez entendu dire qu'un bloc enfin n'est pas garanti d'être exécuté lors de l'arrêt de JVM lors de l'exécution du Essayez (ou attrape ) bloc. C'est correct (et cela peut facilement arriver aux fils de démon).

Mais encore une fois: Pendant le fonctionnement normal, il n'y a plus rien qui arrête enfin des blocs d'exécution normalement dans les threads de démon: ils sont pas manipulés différemment .

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 pour exécuter plus de déclarations.

Par exemple, sur les systèmes d'exploitation POSIX-Y, SIGNAL 9 (SIGKILL) FORCES Une application à cesser de fumer, ce qui ne donne aucune chance de faire un nettoyage (c'est pourquoi le signal 15 (sigterm) est préféré , d'habitude). Dans ce cas, la JVM ne peut pas exécuter le bloc enfin , car le système d'exploitation ne le laissera plus courir.


2 commentaires

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).




2
votes

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.

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. xxx


0 commentaires