Как мне реализовать изящное завершение в Java? - PullRequest
11 голосов
/ 17 мая 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

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

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

На самом деле это подробно объясняется в javadoc .

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

2 голосов
/ 17 мая 2011

Это работает для меня, захват 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);
        }
    }
}
...