Поймать Ctrl + C в Java - PullRequest
       28

Поймать Ctrl + C в Java

70 голосов
/ 23 октября 2009

Можно ли перехватить сигнал Ctrl + C в приложении командной строки Java? Я хотел бы очистить некоторые ресурсы перед завершением программы.

Ответы [ 2 ]

81 голосов
/ 23 октября 2009

Вы можете прикрепить отключающий хук к виртуальной машине, который запускается всякий раз, когда виртуальная машина выключается:

Виртуальная машина Java отключается в ответ на два вида событий:

  • Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод выхода (эквивалентно System.exit), или

  • Виртуальная машина завершает работу в ответ на пользовательское прерывание, например, ввод Ctrl + C или общесистемное событие, например пользователь выход из системы или отключение системы.

Тем не менее, поток, который вы передаете как ловушка отключения, должен следовать нескольким правилам, поэтому внимательно прочитайте связанную документацию, чтобы избежать каких-либо проблем. Это включает обеспечение безопасности нити, быстрое завершение нити и т. Д.

Кроме того, как отмечает комментатор Джеспер, перехватчики завершения работы гарантированно будут работать при нормальном завершении работы виртуальной машины, но если процесс виртуальной машины завершается принудительно, они этого не делают. Это может произойти, если исходный код испортится или вы принудительно завершите процесс (kill -9, taskkill /f).

Но в этих сценариях все ставки в любом случае отменены, поэтому я бы не стал тратить на это слишком много внимания.

25 голосов
/ 04 октября 2015

Только для быстрого тестирования консоли ...

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();
            }
        }
    });
...