2016-05-23 3 views
14

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

@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) 
    } 
} 
+0

Не обходите себя нитями самостоятельно. Создайте «TaskExecutor» и зарегистрируйте свой класс как компонент. Затем добавьте «CommandLineRunner», который выполняет как задачу, так и «TaskExecutor» для планирования задачи. Также вам действительно нужен поток? –

ответ

19

Не обходите себя нитями самостоятельно. 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 будут инициализированы.

+1

Что делать, если нам нужно вводить зависимости в класс Runnable? – mapm

+0

@mapm CommandLineRunner - это bean-компонент, поэтому зависимости будут вводиться как обычно. – user2189998