2008-11-04 16 views
14

je lance un processus enfant en Java comme suit:Comment se débarrasser des processus fils Java lorsque mon application Java se ferme/se bloque?

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

Il fonctionne maintenant en arrière-plan. Tout va bien et bien.

Si mon programme se bloque maintenant (est toujours dans dev :-)) le processus enfant semble toujours traîner. Comment puis-je le faire se terminer automatiquement lorsque le processus Java parent meurt?

Si elle aide, je suis sous Mac OS X 10.5

Répondre

10

Comme vous l'avez dit, addShutdownHook est le chemin à parcourir.

MAIS:

  • Il n'y a pas vraiment garantie que vos crochets d'arrêt sont exécutés si le programme se termine. Quelqu'un pourrait tuer le processus Java et dans ce cas votre hook d'arrêt ne sera pas exécuté. (comme dit dans ce SO question)

  • certaines des bibliothèques standard ont leurs propres crochets qui peuvent fonctionner avant les vôtres.

  • Attention aux blocages.

Une autre possibilité serait de wrap your java program in a service.

8

Je l'ai travaillé sur moi-même déjà. Ajouter un crochet d'arrêt, comme suit:

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));