Подтвердить что ты не робот

Захват Ctrl + C в Java

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                e.printStackTrace();
            }
        }
    });