#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_signals2. Ваш пример отлично работает для меня, когда я вставляю его в
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 работает только при регулярном завершении программы…