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();
}

Это не идеальное решение, но должно привести вас по крайней мере в правильном направлении.

Другие вопросы по тегам