Java 在springboot应用程序上启动线程
我想在spring启动后执行一个java类(其中包含一个我想执行的java线程)。我的初始代码:Java 在springboot应用程序上启动线程,java,spring,spring-boot,Java,Spring,Spring Boot,我想在spring启动后执行一个java类(其中包含一个我想执行的java线程)。我的初始代码: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 下面是我想在开始时执行的代码: public class SimularProfe
@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
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}
然后创建一个CommandLineRunner
(尽管ApplicationListener
也可以)来安排任务
@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor) {
return new CommandLineRunner() {
public void run(String... args) throws Exception {
executor.execute(new SimularProfesor());
}
}
}
当然,您也可以创建自己的由spring管理的类
这样做的好处是Spring还可以为您清理线程,您不必自己考虑。我在这里使用了CommandLineRunner
,因为它将在所有bean初始化bean之后执行 - 主级弹簧靴
@SpringBootApplication @EnableAsync @Controller public class ...
- 示例类控制器
import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Component; @Component public class ExecutorBase { private static final Logger log = LoggerFactory.getLogger(ExecutorBase.class); @Autowired private TaskExecutor taskExecutor; @Autowired private ApplicationContext applicationContext; private Boolean debug = true; @PostConstruct public void atStartup() { ClasseTaskRunn classeTaskRunn = applicationContext.getBean(ClasseTaskRunn.class); taskExecutor.execute(classeTaskRunn ); if (debug) { log.warn("###### Startup ok"); } } }
- 示例类任务可运行
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component @Scope("application") public class ClasseTaskRunn implements Runnable { private static final Logger log = LoggerFactory.getLogger(ClasseTaskRunn.class); @Autowired ClasseDAO classeDAO; @Override public void run() { longBackgorund(); } protected void longBackgorund() { while (test) { if (debug) { log.warn("###### DEBUG: " ... ); } try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
TaskExecutor
,并将您的类注册为bean。然后添加一个CommandLineRunner
,它同时接受任务和TaskExecutor
来调度任务。还有,你真的需要一个线程吗?@M.Deinum我在下面的评论中遇到了错误,请帮忙!!!如果我们需要将依赖项注入可运行类,该怎么办?@mapm CommandLineRunner是一个bean,因此依赖项将照常注入。bean不是注入的。您可以使用@EventListener(ApplicationReadyEvent.class)如果要在Spring上下文初始化后运行线程,请使用注释而不是@PostConstruct