Почему мой основной метод Springboot запускает 2 потока, хотя он вызывается только один раз в коде?

#java #spring-boot

#java #spring-boot

Вопрос:

Я пытаюсь регулярно обновлять файл свойств. Сначала я использовал Timer это scheduleAtFixedRate TimerTask . Поскольку он работал не так, как ожидалось (одновременно всегда работало более одного таймера), я решил использовать простой цикл while в потоке, цикл которого большую часть времени спит.

 @SpringBootApplication
@EnableConfigurationProperties(StorageProperties.class)
public class ServerApplication {

    Package mainPackage = ServerApplication.class.getPackage();
    /**
     * This will return a version only if the entry "Implementation-Version"
     * exists in the Manifest file.
     */
    String version = mainPackage.getImplementationVersion();
    System.out.println(
            version);
    
    new Thread(() -> {

        try {
            while (true) {                 
                
              System.out.println(
                         Thread.currentThread().getName()   " is checking ");
                         
              // Code to write in properties 
              
              // Sleeps some time           
              Thread.sleep(GeneralSettings.CHECK_PERIOD_IN_S * 1000);
              
              // Code to read from properties file to check for updates
            
            } // end of while
            
         } catch (InterruptedException ex) {
            // ...
         }
      }).start();
            
SpringApplication.run(ServerApplication.class,
            args);
  

}

Что я вижу в журналах, так это :

Поток-0 проверяет, поток-4 проверяет

Пожалуйста, обратите внимание: задавая этот вопрос, я также заметил, что версия также отображается дважды и всегда была (я думал, что это проблема конфигурации ведения журнала).

Почему запускаются 2 «проверяющих» потока, тогда как SpringApplication выполняется только один раз, как и ожидалось?

Что я могу сделать, чтобы иметь только один «проверяющий» поток вместо 2?

Любая помощь приветствуется 🙂

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

1. Предположение, вы используете Spring Boot Devtools в качестве зависимости?

2. @M.Deinum Это правильно! Не могли бы вы уточнить?

3. Он будет загружать / запускать классы дважды, удалите devtools, и у вас будет один.

4. При удалении devtools строка отображается только один раз, но другие функции не работают на компьютере разработчика (например, «сбой автоматического подключения зависимостей»). Поэтому я напишу комментарий в коде, чтобы предупредить, что это может произойти! В любом случае спасибо @M. Deinum!

5. Автоматическое подключение не должно завершаться сбоем… Devtools разрешает перезапуски только при изменении кода, который не содержит внедрения зависимостей (если у вас нет других зависимостей?).