2012-08-10 29 views
7

¿Cuáles son algunas soluciones cuando se trata de bibliotecas de terceros que no limpian correctamente los hilos cuando se cierra la biblioteca?Cómo lidiar con bibliotecas de comportamiento incorrecto que no detienen los hilos

Muchas bibliotecas exponen los métodos del ciclo de vida, explícita o implícitamente, para el código que contienen. Por ejemplo, existe un marco de aplicación web dentro de un contexto de aplicación web en un contenedor de servlet. Cuando se crea el contexto, el marco puede iniciar algunos subprocesos, por varias razones.

Ahora, siguiendo el ejemplo más adelante, cuando se cierre el contenedor de servlets o el contexto de la aplicación web, el marco de la aplicación web debería finalizar todos estos hilos. O bien se debe cerrar el ExecutorService s creado por la biblioteca, o se deben promulgar otros medios para detenerlos.

El peor caso es que los hilos son non-daemon threads. De hecho, esto detendría la finalización del proceso de Java. Pero incluso si son hilos daemon, permitir que los hilos continúen es probablemente una mala práctica. Si (volviendo al ejemplo) el contenedor de servlets está incrustado dentro de otro código, es posible que otro código continúe ejecutándose mientras los subprocesos siguen saliendo, lo que puede causar problemas.

No hay una forma programática expuesta para detener estos hilos, entonces, ¿qué se puede hacer?

Si está utilizando una biblioteca de terceros, ¿cuáles son las formas de forzar el cierre de los subprocesos existentes?

Respuesta

5

Si está utilizando una biblioteca de terceros, ¿cuáles son las formas de forzar el cierre de los hilos existentes?

En general, no hay una manera segura de hacer esto que está garantizada para funcionar en todos los casos. Lo más cerca que puede llegar a una solución segura es usar el ThreadGroup para enumerar todos los subprocesos existentes y usar Thread.interrupt() para indicarle a cada subproceso que se detenga. Por supuesto, no hay garantía de que los hilos prestarán atención, o que se cerrarán limpiamente en respuesta a una interrupción.

OMI, la mejor estrategia es:

  • si los hilos no necesitan ser cerrado limpiamente , a continuación, tirar del enchufe en la JVM llamando System.exit()

  • si los hilos deben cerrarse limpiamente para evitar la posibilidad de daños, entonces no use la biblioteca ... o solucione el problema usted mismo.

+3

+1 Puede ejecutar la biblioteca es un proceso separado que reduce el impacto de matar el proceso. (Funciona también para bibliotecas JNI) –

+0

Gracias @Stephen. Sí, todos los hilos se pueden recuperar, y sus ThreadGroups, como se describe aquí: http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads- current-running-in-java. System.exit() solo funciona cuando la biblioteca que estaba creando los hilos se considera el código de "primera clase" para ese proceso. No sirve si la biblioteca * simplemente es * utilizada por * el código. –

+1

@Peter depende de la biblioteca, por supuesto ... ejecutar en un proceso separado hará que la comunicación sea más difícil. –

Cuestiones relacionadas