Java, управляемое завершение работы приложения в ответ на CTRL^D

Я разработал распределенное онлайн-приложение Java, которое обычно активно все время (не с графическим интерфейсом).

Мне интересно выполнить некоторые действия перед отключением на случай, если администратор заинтересован в таком отключении.

Я знаю, что CTRL^C останавливает JVM, интересно, могу ли я перехватить CTRL^C и выполнить некоторые дополнительные операции перед выключением JVM или добавить какой-нибудь хук к событию CTRL^D, чтобы сделать то же самое.

Я почти уверен, что где-то есть сообщение, описывающее подобные вопросы, и я был бы признателен за ссылки на такие сообщения.

меня не интересуют сторонние внешние банки или какое-либо решение JNI.

Я буду признателен за фрагмент кода, если нет поста, посвященного тому же вопросу.

Дополнительное ограничение: Это решение должно работать как для UNIX, так и для Windows.

Изменить

Одним из предложенных здесь решений является использование Runtime.getRuntime().addShutdownHook(new Thread() {})

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

  1. Интересно, могу ли я как-то сигнализировать основному потоку о том, что произошло отключение (у меня есть распределенная система, как я уже упоминал, и мне нужно информировать каждый отдельный поток о таком событии)?

  2. Могу ли я добавить несколько потоков для прослушивания этого события?


person Michael    schedule 29.10.2012    source источник
comment
В системах Unix Ctrl+D завершает стандартный ввод. Ctrl+все, что обрабатывается терминалом. Таким образом, вы не можете подключить Ctrl + что-либо в программе Java.   -  person ignis    schedule 29.10.2012
comment
Возможный дубликат: stackoverflow.com/questions/1028687/   -  person beny23    schedule 29.10.2012
comment
@ignis: CTRL^* НЕ ДОЛЖЕН, любая другая комбинация приветствуется   -  person Michael    schedule 29.10.2012
comment
@beny23: +1, спасибо, я пропустил этот пост, надеюсь, он поможет, сейчас я пройдусь по нему   -  person Michael    schedule 29.10.2012
comment
@ beny23: Пожалуйста, посмотрите мой РЕДАКТИРОВАТЬ, мне жаль, что я обновил вопрос, и мне, вероятно, пришлось открыть новый, я буду очень признателен за ответ на расширенный вопрос.   -  person Michael    schedule 29.10.2012


Ответы (1)


Чтобы реагировать на CTRL+C, вы должны добавить хук выключения:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        System.out.println("I'll be back!");
    }
});
person Emmanuel Bourg    schedule 29.10.2012
comment
Спасибо, я прочитал это решение в сообщении в комментарии, предоставленном beny23. - person Michael; 29.10.2012
comment
Пожалуйста, посмотрите мой РЕДАКТИРОВАТЬ, мне жаль, что я обновил вопрос, и мне, вероятно, пришлось открыть новый, я буду очень признателен, если вы сможете расширить свой ответ. - person Michael; 29.10.2012