一尘不染

在springboot应用程序中启动线程

spring-boot

我想在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)
     }
}

阅读 2502

收藏
2020-05-30

共1个答案

一尘不染

不要自己弄乱线程。Spring(还有普通的Java)对此有一个很好的抽象。

首先TaskExecutor在您的配置中创建该类型的Bean

@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之前安排自己的课程。

这样做的好处是,Spring还将为您清理线程,而您不必自己考虑。我在CommandLineRunner这里使用了a
,因为它将在所有bean都初始化之后执行。

2020-05-30