Question

J'écris un client Java qui théoriquement pourrait être utilisé dans un environnement différent. Java principal (), dans un conteneur de servlet, ou par injection de dépendance

Le client met en œuvre 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 « blocage » à 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 la machine virtuelle Java est en baisse, ce qui me permettra d'appeler ma mise en œuvre shutdown ().

Était-ce utile?

La solution

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

Je crois que si vous marquez vos fils individuels comme « daemons » (via la méthode Thread.setDaemon), la machine virtuelle Java ne garder en vie si seulement threads démon sont laissés.

De la JavaDoc:

Marques ce fil soit comme un thread démon ou d'un fil d'utilisateur. Les sorties de la machine virtuelle Java lorsque les seuls threads en cours d'exécution sont tous les fils de démon.

En utilisant cela, si votre thread non-démon primaire est terminée, la machine virtuelle Java ne sera pas « raccrochage » à cause de l'autre thread en cours d'exécution, et ce déclencheur vos crochets d'arrêt sans avoir à envoyer explicitement mettre fin à des instructions aux différents fils .

Autres conseils

Runtime.getRuntime().addShutdownHook() serait la chose que je penserais. http://blog.yohanliyanage.com/2010/ 10 / savoir-la-jvm-arrêt-2-crochets / a explication décente. Est-ce que l'aide?

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 un argument, si l'appelant est responsable de son cycle de vie. C'est, l'utilisation de l'injection depency pour pousser la politique vers le haut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top