Здесь есть несколько хороших ответов, но я все еще вижу недостающую информацию.
Ваш код регистрирует отключение в main
, после чего main достигает конца и возвращается. Хуки завершения вызываются, когда выходит последний поток, не являющийся демоном. Я подозреваю, что main является единственным потоком, не являющимся демоном, поэтому при выходе из main
ловушка вызывается немедленно.
Если вы не хотите, чтобы ваша программа выходила немедленно, тогда main
придется зацикливаться и ждать какого-то сигнала. Из контекста вашего вопроса, я полагаю, он должен прислушиваться к какому-то ответу на звонок sendMessage
? Если вы хотите дождаться control-c, тогда мне нравится ответ @JB Nizet:
public static void main(String[] args) throws InterruptedException {
...
Runtime.getRuntime().addShutdownHook(...);
// wait until control-c is called
final Object o = new Object();
synchronized(o) {
while(true) {
o.wait();
}
}
}
Вы хотите начать ждать после того, как вы зарегистрируете свой хук отключения, чтобы ваш код отмены запускался.