Начать в приложении springboot

Я хочу выполнить класс java (который содержит поток java, который я хочу выполнить) после запуска весенней загрузки. Мой исходный код:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

И вот код, который я хочу выполнить при запуске:

public class SimularProfesor implements Runnable{

    // Class atributes

    // Constructor
    public SimularProfesor() {
        //Initialization of atributes
    }

    @Override
    public void run() {
        while(true) {
            // Do something
        }
    }
}

Как я могу назвать этот поток? Это то, что я должен делать:

@SpringBootApplication
public class Application {
     public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        // Call thread (constructor must be executed too)
     }
}

Ответ 1

Не обходите себя нитями самостоятельно. Spring (а также простая Java) имеет для этого хорошую абстракцию.

Сначала создайте компонент типа TaskExecutor в вашей конфигурации

@Bean
public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}

Затем создайте CommandLineRunner (хотя бы ApplicationListener<ContextRefreshedEvent> также работал), чтобы запланировать вашу задачу.

@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor) {
    return new CommandLineRunner() {
        public void run(String... args) throws Exception {
            executor.execute(new SimularProfesor());
        }
    }
}

Разумеется, вы также можете сделать свой собственный класс под управлением весны.

Преимущество этого в том, что Spring также очистит потоки для вас, и вам не нужно думать об этом самостоятельно. Я использовал CommandLineRunner здесь, потому что это будет выполняться после того, как все компоненты bean будут инициализированы.

Ответ 2

пожалуйста, обратитесь к этому примеру, у вас есть 3 способа начать поток.