web-dev-qa-db-fra.com

Attraper Ctrl + C dans Java

Est-il possible d’attraper le Ctrl+C signal dans un Java application de ligne de commande? Je voudrais nettoyer certaines ressources avant de terminer le programme.

70
Pierre

Vous pouvez attacher un crochet d'arrêt au VM qui s'exécute chaque fois que le VM s'arrête:

La machine virtuelle Java s'arrête en réponse à deux types d'événements:

  • Le programme se ferme normalement, lorsque le dernier thread non démon se termine ou lorsque la méthode exit (de manière équivalente, System.exit) est invoquée, ou

  • La machine virtuelle est arrêtée en réponse à une interruption utilisateur, telle que la saisie Ctrl+Cou un événement à l'échelle du système, tel que la fermeture de session utilisateur ou l'arrêt du système.

Le thread que vous passez en tant que hook d'arrêt doit cependant suivre plusieurs règles, alors lisez attentivement la documentation liée pour éviter tout problème. Cela comprend la sécurité du fil, la terminaison rapide du fil, etc.

En outre, comme le souligne Jesper, les hooks d'arrêt sont garantis pour fonctionner lors d'un arrêt normal du VM mais si le processus VM est terminé de force, ils ne le font pas) . Cela peut se produire si le code natif bousille ou si vous tuez de force le processus (kill -9, taskkill /f).

Mais dans ces scénarios, tous les paris sont de toute façon désactivés, donc je n'y perdrais pas trop de temps.

81
Joey

Juste à des fins de test rapide de la console ...

Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            try {
                Thread.sleep(200);
                System.out.println("Shouting down ...");
                //some cleaning up code...

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
25
bkomac