¿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?
+1 Puede ejecutar la biblioteca es un proceso separado que reduce el impacto de matar el proceso. (Funciona también para bibliotecas JNI) –
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. –
@Peter depende de la biblioteca, por supuesto ... ejecutar en un proceso separado hará que la comunicación sea más difícil. –