如何在Spring bean中启动一个线程

时间:2017-07-25 09:49:58

标签: java multithreading spring-mvc dependency-injection autowired

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

    @Component
    public class MyServiceCreationListener {


        public void startThread() {

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

        }
    }

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

请为春天管理MyThread提供解决方案,就像spring bean一样,我们可以将它自动装入其他bean,并通过调用start()方法来访问它

这是Thread类

@Component
public class MyThread implements Runnable {

    public void run() {

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

    }

}

1 个答案:

答案 0 :(得分:4)

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

LifeCycle of Thread in Java

因此,您需要每次都创建一个新对象,并且可以使用prototype范围和ObjectFactory来实现。

扩展Thread

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

    public void run() {

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

    }
}

然后:

@Component
public class MyServiceCreationListener {

    @Autowired
    ObjectFactory<MyThread> myThreadFactory;

    public void startThread() {
        myThreadFactory.getObject().start();
    }
}

此代码尚未经过测试,只是为了让您了解。

您可以在此处找到一些示例:Spring and java threads