Как реализовать изящное завершение в Java?

Скажем, например, у меня есть мое приложение, работающее в терминале Linux, и я нажимаю "CTRL + C" на моей клавиатуре, чтобы убить процесс, который он прервет программу Java.

Есть ли способ уловить этот "запрос" в моем приложении Java, чтобы я мог изящно закрыть его и освободить все ресурсы/записи журналов. У меня есть несколько разных потоков, если это имеет значение для ответа.

Я знаю, что у вас есть addShutDownHook, но, как написано в документации Java, он не вызывается при определенных обстоятельствах, например, сигнал kill из "CTRL + C" в Linux... есть ли другие способы?

Runtime.getRuntime().addShutdownHook(new Thread()
{
    public void run ()
    {
        // TODO: implement graceful shutdown here.
    }
});

Ответ 1

Я думаю, что отказ от ответственности существует только для kill -9, поэтому вы не полагаетесь на выключение выключения, чтобы поддерживать уверенность в согласованности ваших данных.

Таким образом, если процессу разрешено воздействовать на сигнал ОС, вызывается hookdown hook, что довольно очевидно, если вы знаете, как работает ОС, но, возможно, не для всех разработчиков Java.

Это подробно объяснено в javadoc.

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

Ответ 2

Это работает для меня, захватывая SIGINT/Ctrl-C в Linux:

public class TestShutdownHook
{
    public static void main(final String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}