2009-08-01 25 views

Répondre

112
Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { /* 
     my shutdown code here 
    */ } 
}); 

Cela devrait être en mesure d'intercepter le signal, mais seulement comme une étape intermédiaire avant la fermetures complètement machine virtuelle Java lui-même, il ne peut pas être ce que vous cherchez après.

Vous devez utiliser un SignalHandler (sun.misc.SignalHandler) pour intercepter le signal SIGINT déclenché par un Ctrl +C (sur Unix, ainsi que sur Windows). Voir this article (pdf, pages 8 et 9).

+0

Le lien est mort ... –

+5

@MartijnCourteaux Cela se passe après cinq ans;) J'ai trouvé une source similaire sur ce sujet et ai changé le lien en conséquence. – VonC

+0

@VonC - Il est à nouveau mort – GurV

15

Je suppose que vous voulez arrêter avec élégance, et ne pas court-circuiter le processus d'arrêt. Si mon hypothèse est correcte, alors vous devriez regarder Shutdown Hooks.

+0

Jamais entendu parler des crochets d'arrêt avant. Je vous remercie! –

7

Afin de pouvoir gérer Ctrl +C sans arrêter pour une raison quelconque, vous aurez besoin d'utiliser une certaine forme de gestion du signal (depuis le Ctrl +entrée C est pas effectivement passé directement à votre application, mais est gérée par le système d'exploitation qui génère un SIGINT qui est ensuite transmis à Java.

Voir http://www.oracle.com/technetwork/java/javase/signals-139944.html pour plus de détails sur le traitement du signal.

(Si vous êtes juste vouloir arrêt grâce, la réponse de AKF suffit.)

4

Quelques liens sur la façon de gérer SIGTERM - qui est le signal le programme devient sur le côté OS:

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

Cela devrait fonctionner sur Posix systèmes - c'est, Mac et Unix devraient fonctionner, sur les fenêtres, je ne suis pas sûr, je me souviens d'avoir entendu que c'est aussi compatible avec POSIX dans une certaine mesure, mais peut-être varty beaucoup avec différents versions.

+1

Le deuxième lien échoue .Est-il remplacé par Oracle au http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf? – chance

+0

le troisième lien échoue également –