Весна - как убить бесконечный цикл - PullRequest
0 голосов
/ 28 ноября 2018

В моем приложении Spring есть планировщик для выполнения некоторой задачи.Запланированные аннотации там не используются, потому что расписание довольно сложное - оно динамическое и использует некоторые данные из базы данных.Так что используется простой бесконечный цикл со спящим потоком.И интервал сна меняется по некоторым правилам.Может быть, все это можно сделать с помощью запланированной аннотации, но вопрос не в этом.

Ниже приведен простой пример:

@Service
public class SomeService {

    @PostConstruct
    void init() {

        new Thread(() -> {

            while (true) {
                System.out.println(new Date());
                try {
                    Thread.sleep(1000);
                } catch (Exception ex) {
                    System.out.println("end");                    
                    return;
                }
            }

        }).start();
    }
}

Код работает нормально, но есть некоторые проблемы с его уничтожением.новый поток.Когда я останавливаю приложение от Tomcat, этот новый поток продолжает работать.Итак, на странице управления Tomcat я вижу, что приложение остановлено, но в лог-файлах Tomcat я все еще вижу вывод из потока.

Так в чем проблема?Как мне изменить код, чтобы поток был убит при остановке приложения?

1 Ответ

0 голосов
/ 29 ноября 2018

Вы пытались реализовать метод @PreDestroy, который будет вызываться до закрытия WebApplicationContext, чтобы изменить логический флаг, используемый в вашем цикле?Хотя кажется странным, что ваши объекты не удаляются, даже когда приложение остановлено ...

class Scheduler {

    private AtomicBoolean booleanFlag = new AtomicBoolean(true);

    @PostConstruct
    private void init() {
        new Thread(() -> {
            while (booleanFlag.get()) {
                // do whatever you want
            }
        }).start();
    }

    @PreDestroy
    private void destroy() {
        booleanFlag.set(false);
    }
}
...