Java 在springboot应用程序上启动线程

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

我想在spring启动后执行一个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

@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