如何在 Spring bean 中启动线程

suh*_*s_n 3 java multithreading dependency-injection spring-mvc autowired

我想在 spring 应用程序中运行一个线程

    @Component
    public class MyServiceCreationListener {


        public void startThread() {

            Thread t = new Thread(new MyThread());
            t.start();

        }
    }
Run Code Online (Sandbox Code Playgroud)

我在这里使用Thread t = new Thread(new MyThread());这是错误的方式。

请为此提供解决方案,以便像 spring bean 一样 spring 管理 MyThread,以便我们可以将其自动装配到其他 bean 中,并通过调用start()方法我们可以访问它

这是线程类

@Component
public class MyThread implements Runnable {

    public void run() {

        System.out.println("Inside run()");

    }

}
Run Code Online (Sandbox Code Playgroud)

alf*_*ope 5

默认情况下,spring bean 是单例的,但是 Thread 的run方法只会运行一次。之后,它被认为处于与 RUNNABLE 不同的状态。

Java中线程的生命周期

因此,您每次都需要创建一个新对象,您可以使用prototypescope 和ObjectFactory来做到这一点。

扩展Thread

@Bean
@Scope("prototype")
public class MyThread implements Runnable {

    public void run() {

        System.out.println("Inside run()");

    }
}
Run Code Online (Sandbox Code Playgroud)

进而:

@Component
public class MyServiceCreationListener {

    @Autowired
    ObjectFactory<MyThread> myThreadFactory;

    public void startThread() {
        myThreadFactory.getObject().start();
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码未经测试,仅供您参考。

您可以在此处找到一些示例:Spring 和 java 线程