Перехват завершения работы Java

#java

#java #перехват #завершение работы

Вопрос:

Я добавил следующий код в свою программу:

 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("exit");
    }
}){});
  

Однако я не вижу сообщения. Дополнительная информация: я запускаю программу из среды IDE Netbeans на Java 7.

РЕДАКТИРОВАТЬ: я забыл добавить, что существует глобальный поток, который поддерживает работу программы. Я закрываю его, нажимая [x] в правом нижнем углу Netbeans.

Комментарии:

1. Попробуйте отправить SIGHUP процессу Java ( kill -1 <pid> ) вместо нажатия кнопки пользовательского интерфейса. en.wikipedia.org/wiki/Unix_signal#POSIX_signals

2. Ваш пример отлично работает для меня, когда я вставляю его в main метод.

3. Обратите внимание, что {} в этом нет необходимости. Это фактически создает анонимный внутренний подкласс Thread .

4. В Runnable нет необходимости. Вместо этого вы можете переопределить метод run потока, и он будет функционально идентичен.

Ответ №1:

JVM может завершать работу либо упорядоченным, либо резким образом. Перехват завершения работы выполняется для упорядоченного завершения работы: когда завершается последний normal поток, кто-то вызывает System.exit или использует другие средства, зависящие от платформы (например, ввод Ctrl-C).

Перехваты завершения работы не будут выполняться для внезапного завершения работы JVM. Когда вы нажимаете [x] в правом нижнем углу Netbeans, это приведет к резкому завершению работы JVM, и именно поэтому перехват завершения работы не был запущен.

Например :

 public class ShutdownHook {
public void attachShutDownHook() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            System.out.println("exit");
        }
    });

}

public static void main(String[] args) {
    ShutdownHook sample = new ShutdownHook();
    sample.attachShutDownHook();
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
  

}

Если вы запустите приведенный выше код и дадите программе нормально завершиться, вы увидите exit напечатанный на консоли. Но если вы нажмете [x] (в течение 3 секунд), чтобы резко закрыть его, перехват завершения работы не будет запущен, и на консоли ничего не будет exit напечатано.

Комментарии:

1. Хорошо, тогда я это понимаю. Текущий код (со значимым перехватом завершения работы) по-прежнему стоит сохранить. Но есть ли также способ выполнить правильное завершение работы с помощью het Netbeans close? Также, что было бы хорошим способом обычного завершения работы программы? У меня нет доступа к системе. В, поскольку консоль постоянно используется для вывода.

2. вы можете использовать System.exit(0); в коде для завершения работы вашей программы.

3. Программа — это программа, которая должна реагировать, когда файлы добавляются в определенную папку, поэтому я боюсь, что она должна работать вечно. Все еще нужен какой-то способ правильно отключить его в случае обслуживания.

4. когда вы вводите crtl c на консоли, будет запущен перехват завершения работы. и если у вас есть пользовательский интерфейс, вы можете использовать System.exit(0); .

Ответ №2:

Я забыл добавить, что существует глобальный поток, который поддерживает работу программы. Я закрываю его, нажимая [x] в правом нижнем углу Netbeans.

Ну вот и все, закрытие программы на «x» в правом нижнем углу netbeans не является обычным завершением работы, оно просто все ломает и завершает работу.

ShutdownHook работает только при регулярном завершении программы…