2016-02-19 1 views
1

Je suis nouveau dans le monde du multithreading et du déploiement de code sur un serveur. J'ai un projet qui a un fil conducteur. Ce thread principal dispose d'un pool de threads de 10 autres threads qui "interrogent" le matériel différent en utilisant SNMP. Ces threads font ensuite des tâches de base de données et cette base de données va vers un front-end webapp. Le thread principal utilise un planificateur pour garder la tâche en cours d'exécution pour toujours et se répète toutes les 15 secondes. En eclipse, j'ai exporté un .jar exécutable et l'ai exécuté sur un serveur en utilisant "nohup java -jar nameOfJar.jar &". Maintenant, pour tuer ce processus, j'utilise "ps -ef | grep java" pour voir quel PID est utilisé par nameOfJar.jar et utiliser "kill PIDofNameOfJar" pour tuer le processus. Je suis novice en multithreading et je me demande ce qui arrive aux threads lorsque j'utilise la commande kill. Y a-t-il un nettoyage à faire? Ou devrais-je avoir du code pour faire face à cela? Ou ne devrais-je pas utiliser la commande kill pour arrêter un pot runnable?Tuer un pot runnable avec un nettoyage?

Je pense que puisque je tue le processus principal les 10 autres threads ne seront pas terminés s'ils ont été envoyés mais je ne suis pas sûr.

Toute aide serait appréciée!

Répondre

0

Il n'y a pas d'autre nettoyage en plus de libérer les ressources détenues par JVM (mémoire allouée de manière basique, peut-être des sockets et des hooks de fichiers). Toutes les autres ressources (comme commettre ou annuler des transactions db) doivent être faites avant cela car cela n'arrivera pas automatiquement.

Vous pouvez vous connecter au processus d'arrêt JVM via Runtime.addshutdownhook(). Ce hook sera exécuté pendant la fermeture de la machine virtuelle Java (pas de manière anormale en raison d'une erreur JVM), par exemple. quand sigterm est envoyé à JVM. Vous pouvez faire votre nettoyage là-bas.