在SpringBoot中可以通过传统的集成Thread或者实现Runnable接口实现多线程,也可以使用SpringBoot中的提供的@Async注解来实现多线程。使用不当都会出现自动注入的失败或者异常报错从而影响功能实现。下面对在SpringBoot中的多线程实现的两种方式做一个记录。
1.集成Thread或实现Runnable接口来实现多线程
一搜类似标题网上都是说多线程下不能自动注入,需要一个实现ApplicationContextAware的工具类来从spring容器中获取线程中需要的bean,然后在线程的构造方法中完成赋值相当于注入。我就有些纳闷,你不用spring注入的线程对象当然不能自动注入线程内的对象了。为什么不用获取上下文中bean的工具类去获取线程对象呢?感觉这才更加合理。
所以我觉得正确的操作应该是,用
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
两个注解来修饰线程,让这个线程成为原型模式,成为原型模式的线程,在每次注入或者从spring上下文环境中获取对象时都会新建对象并返回。于是
//文件创建的线程已修改为原型模式此处注入两个
@Autowired
CreateFileQueue createFileQueue;
@Autowired
CreateFileQueue createFileQueue2;
这样就有了两个对象,
//启动文件新建的线程
Thread threadCreate=createFileQueue;
Thread threadCreate2=createFileQueue2;
threadCreate.start();
threadCreate2.start();
这样就启动了两个可以自动注入的线程。非常合乎逻辑。
若线程更多。可以用for循环从Spring上下文中获取:
利用 实现ApplicationContextAware接口 的工具类来操作Spring的上下文环境获取Spring管理的Bean实例,在用Scope限定为原型模式的bean对象,每次获取都是是个新的对象。
具体代码可参考:
https://www.jianshu.com/p/3cd2d4e73eb7
转载于简书大佬。
2.通过SpringBoot自带的@Async注解来实现多线程
@Async注解是springBoot