Java-эквивалент среды.NET.HasShutdownStarted
В.NET вы можете проверить Environment.HasShutdownStarted
свойство, чтобы увидеть, выгружается ли ваша служба по какой-либо причине, и выполнить постепенную выгрузку / очистку.
Так что вместо:
while (true) { }
...ты можешь использовать...
while (!Environment.HasShutdownStarted) { }
Есть ли эквивалентная вещь в Java?
3 ответа
Возможно, вы ищете крюк отключения? Это позволяет вам указать поток, который будет запускаться при закрытии приложения (если оно не было принудительно закрыто с помощью kill -9
или аналогичные, но в этом случае ни одна среда не может гарантировать что-либо сделать при выключении.)
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
//Code here.
}
});
С практической точки зрения, вы также должны сделать эти потоки быстрыми для выполнения - так как в противном случае приложение будет зависать при выходе, и это никому не нравится (плюс, ОС или пользователь может решить закрыть приложение, отменив хук). в произвольной точке.)
Вы можете добавить несколько перехватчиков завершения работы, и они будут выполняться одновременно (и в произвольном порядке).
Снятие отключающих крючков можно выполнить аналогичным образом, позвонив по телефону. removeShutdownHook()
,
Вы можете добавить крюк отключения. В основном регистрирует незапущенный поток, который будет работать после завершения работы приложения.
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// logic for making a clean shutdown...
}
})
Ссылка выше имеет очень хорошее описание того, что происходит во время выключения.
Вы можете взглянуть на API завершения подключения и вместо того, чтобы делать
while(true) {
}
Вы можете объявить участника в своей реализации потока / запуска для обозначения выключения:
class MyRunnable implements Runnable {
private running= false;
public void setRunning(boolean running) {
running= running;
}
public void run() {
setRunning(true);
while(running) {
// do task
}
}
}
public static void main(String[] args) {
final MyRunnable myRunnable= new MyRunnable();
final Thread runThread= new Thread(myRunnable);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
myRunnable.setRunning(false);
}
});
runThread.start();
runThread.join();
}
Это не идеальное решение, но должно привести вас по крайней мере в правильном направлении.