我想在Spring Boot开始后执行一个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) } }
不要自己弄乱线程。Spring(还有普通的Java)对此有一个很好的抽象。
首先TaskExecutor在您的配置中创建该类型的Bean
TaskExecutor
@Bean public TaskExecutor taskExecutor() { return new SimpleAsyncTaskExecutor(); // Or use another one of your liking }
然后创建一个CommandLineRunner(尽管ApplicationListener<ContextRefreshedEvent>也可以)计划您的任务。
CommandLineRunner
ApplicationListener<ContextRefreshedEvent>
@Bean public CommandLineRunner schedulingRunner(TaskExecutor executor) { return new CommandLineRunner() { public void run(String... args) throws Exception { executor.execute(new SimularProfesor()); } } }
当然,您也可以在Spring之前安排自己的课程。
这样做的好处是,Spring还将为您清理线程,而您不必自己考虑。我在CommandLineRunner这里使用了a ,因为它将在所有bean都初始化之后执行。