Comment la JVM de résilier le fils de démon? ou Comment écrire les fils de démon qui se terminent normalement
Scénario hypothétique:
J'ai un fil de démon responsable de quelques I/O, le thread principal de finitions et de rendement, et la JVM décide de résilier mon fil de démon.
Comment fait-il donc? Interrompre? Finaliser? Comment puis-je code mon démon fil de sorte qu'il réagit normalement en cas de fermeture?
- Avez-vous regarder le code source?
- Qui n'avait pas eu pour moi, et serait certainement donner une réponse définitive (pas forcément utile). J'ai personnellement, cependant, je ne suis pas assez courageux pour tenter et n'a pas vraiment d'attendre que quelqu'un d'autre.
- Tout droit, permettez-moi d'être plus explicite. La meilleure façon de répondre à une question comme cela est de regarder le code source, ou au moins le code Java. Généralement parlant, il est facile à lire et bien commenté. (Et j'ai du mal à comprendre comment une réponse définitive à une question est moins utile qu'un non définitif ... surtout si vous avez été la personne qui lit le code!)
- Raconter l'OP à regarder le code source n'est pas une réponse. Qui montre une mise en oeuvre particulière, pas les exigences de l'API. La Documentation est à sa place.
Vous devez vous connecter pour publier un commentaire.
Je viens d'écrire le code suivant comme un test:
J'ai mis des points d'arrêt dans le bloc catch de la fil de démon et de la méthode finalize. Ni point d'arrêt a été atteint, même si le bloc try est exécuté. Évidemment, ce code a de synchronisation/problèmes de timing, mais je crois que nous pouvons conclure que les fils de démon ne sont pas interrompu lors de l'arrêt ni de leur finalize() méthodes nécessairement invoquée.
Vous pouvez toujours ajouter une fermeture à crochet à la JVM d'Exécution:
Votre arrêt de crochet peut évidemment faire que les tâches sont nécessaires pour une "gracieuse" de l'arrêt.
System.gc()
explicitement et de l'option de la JVM-XX:+DisableExplicitGC
n'est pas défini, alors le démon fil de sortie. Cela signifie Garbage Collector est responsable pour arrêter le fils de démon après tous les threads utilisateur terminer.Je pense que vous ne comprenez pas ce qu'est un fil de démon.
Voir qu'est ce qu'un démon thread en java
En résumé, cela signifie essentiellement que d'un fil de démon ne devriez pas faire tout I/O ou de détenir des ressources. Si vous êtes de contrevenir à cette règle de base, alors votre thread n'a pas droit d'être un fil de démon.
L'ajout d'un crochet d'arrêt est la façon habituelle de s'assurer que votre code est appelé avant la JVM de résiliation, mais même cela n'est pas garanti à 100% - votre JVM pouvait provoquer un crash par exemple, en laissant l'OS de ranger des ressources d'une manière qui protège l'OS, mais tout à fait probable que les feuilles de votre application dans un incohérentes erronée de l'état.
Système de vérification et de recouvrement des mécanismes de revenir aux premiers jours de logiciels (systèmes d'exploitation et les opérations de traitement par exemple), et malheureusement, cette roue ne cesse de se ré-inventé comme il n'y a pas de "silver bullet" approche (API), qui s'attaque à ce problème dans un générique assez moyen.
Autant que je sache,fils de Démon pas vraiment pour les principaux flux I/O de travail. Si tous les threads sont terminées, JVM peut fermer tous les fils de démon brusquement. Les travaux autour de votre condition sera de créer un ExecutorService comme ci-dessous:
invoquer executorservice de la méthode d'arrêt de Arrêt de crochet.
Executors.defaultThreadFactory()
retourne juste unnew DefaultThreadFactory()
utilisation d'interrompre et de vous y joindre: