Traitement du signal en utilisant "TERM"
Question
J'ai une application autonome dans laquelle je dois demander à l'utilisateur une boîte de dialogue de confirmation pour enregistrer les modifications apportées par lui lorsqu'il tente d'arrêter le système en démarrer - > arrêter
.
J'ai appris qu'en utilisant les gestionnaires de signaux
, nous pouvons le faire.
Quelqu'un peut-il m'aider à utiliser les gestionnaires de signaux
La solution
Mise à jour de mai 2012 (2 ans et demi plus tard)
Sur les versions actuelles de Java, ce code de traitement du signal échoue car le code "
INT
" le signal est "réservé par la machine virtuelle ou le système d'exploitation".
De plus, aucun des autres noms de signal valides ne se déclenche lorsque quelque chose demande la fermeture de l'application (j'ai juste testé minutieusement tous ceux sur lesquels je pouvais trouver ...)
Le crochet d'arrêt fonctionne généralement, mais nous constatons que dans notre cas, il ne déclenche pas. La prochaine étape consiste donc évidemment à enregistrer un gestionnaire situé dans le dos de la JVM
Le chapitre & Intégration du signal et gestion des exceptions " du " Guide de dépannage de la machine virtuelle HotSpot " mentionne les signaux " SIGTERM
, SIGINT
, SIGHUP
" uniquement pour SE Solaris et Linux.
Seuls les traitements d'exception sous Windows sont mentionnés.
Réponse originale (septembre 2009)
a ShutdownHook devrait pouvoir gérer ce cas
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// what you want to do
}
}));
(avec mises en garde )
Voir aussi:
- Traitement et arrêt du signal Java (le lien est mort, voir archive ou miroir )
- traitement des signaux de sortie java :
comme illustration du traitement simple des signaux:
public class Aaarggh {
public static void main(String[] args) throws Exception {
Signal.handle(new Signal("INT"), new SignalHandler () {
public void handle(Signal sig) {
System.out.println(
"Aaarggh, a user is trying to interrupt me!!");
System.out.println(
"(throw garlic at user, say `shoo, go away')");
}
});
for(int i=0; i<100; i++) {
Thread.sleep(1000);
System.out.print('.');
}
}
}