2008-11-04 15 views
14

pongo en marcha un proceso hijo en Java de la siguiente manera:¿Cómo me deshago de los procesos secundarios de Java cuando mi aplicación Java se cierra/falla?

final String[] cmd = {"<childProcessName>"}; 
Process process = Runtime.getRuntime().exec(cmd); 

Ahora ejecuta en segundo plano. Todo bien y bien.

Si mi programa falla ahora (es todavía en desarrollo :-)) el proceso hijo todavía parece estar suspendido. ¿Cómo puedo hacer que termine automáticamente cuando muere el proceso principal de Java?

Si ayuda, Estoy utilizando Mac OS X 10.5

Respuesta

10

Como usted ha dicho, addShutdownHook es el camino a seguir.

PERO:

  • No hay ninguna garantía real de que los ganchos de cierre se ejecutan si el programa termina. Alguien podría matar el proceso de Java y en ese caso su gancho de cierre no se ejecutará. (como se dice en este SO question)

  • algunas de las bibliotecas estándar tienen sus propios ganchos que pueden ejecutarse antes que los suyos.

  • cuidado con los bloqueos.

Otra posibilidad sería wrap your java program in a service.

8

trabajé yo mismo ya. Añado un gancho de cierre, de la siguiente manera:

final String[] cmd = {"<childProcessName>"}; 
final Process process = Runtime.getRuntime().exec(cmd); 
Runnable runnable = new Runnable() { 
    public void run() { 
     process.destroy(); 
    } 
}; 
Runtime.getRuntime().addShutdownHook(new Thread(runnable)); 
Cuestiones relacionadas