2011-01-22 2 views
2

J'écris un client Java qui pourrait théoriquement être utilisé dans un environnement différent: Java principal(), dans un conteneur de servlet, ou par injection de dépendance.Comment implémenter le pool de threads qui s'arrêtera automatiquement à la fin de l'exécution?

Le client implémente la mise en commun de fil de connexion interne.

Le problème avec cette approche est que les utilisateurs du client qui ne sont pas conscients du fait qu'un pool de threads interne est mis en œuvre verra son application « pendre » à l'arrêt. Mes utilisateurs doivent savoir pour envoyer un message shutdown() à la bibliothèque.

Je me demande si une autre approche alternative pourrait être prise qui, d'une part, permettez-moi de commencer un pool de threads pour mes connexions; et, d'autre part, attraper un événement, peut-être un événement JVM, qui indique que la JVM est en panne, ce qui me permettra d'appeler mon implémentation shutdown(). serait la chose que je pense de

+0

double possible de [Où puis-je commencer à enquêter sur mon processus de Java qui ne se terminera pas?] (Http://stackoverflow.com/questions/3236427/where-do-i-start-investigating-my-java-process -end -Que-coutume) – finnw

Répondre

5

Bien que vous pouvez ajouter des crochets, comme cela a été suggéré précédente, le problème que vous êtes encore susceptible d'avoir est le fil piscine toujours des threads actifs.

Je crois que si vous marquez vos threads individuels en tant que "démons" (via la méthode Thread.setDaemon), alors la JVM ne sera pas maintenue en vie si seuls les threads de démon sont laissés.

De l'JavaDoc:

Marques ce fil soit comme un thread démon ou un thread utilisateur. La machine virtuelle Java se ferme lorsque les seuls threads en cours d'exécution sont tous les threads démon.

Avec cela, si votre thread principal non-démon est terminée, la machine virtuelle Java ne sera pas « raccrochage » à cause de l'autre course de fil, et ce déclencher vos crochets d'arrêt sans avoir à envoyer explicitement mettre fin à des instructions à les différents fils.

0

Si le problème est que les utilisateurs de votre code ne sont pas au courant il y a une piscine de fil à l'arrêt, peut-être la solution est de les rendre conscients? Dans la méthode d'usine ou constructeur de la classe concernée, ont le ExecutorService à utiliser comme argument, si l'appelant est responsable de son cycle de vie. Cela est, utilisez depency injection pour pousser la politique vers le haut.

Questions connexes