Вопрос

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

Это было полезно?

Решение

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

Виртуальная машина Java завершает работу в ответ на события двух типов:

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

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

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

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

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

Другие советы

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

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();
            }
        }
    });
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top