Java -多线程深入理解与实现、多线程参数传递、多线程下注入Bean无效,如@Resource和@Autowired和@Value 注入为null
目录
一、Java 多线程深入理解与创建、多线程参数传递的教程链接:
2. 【Java】线程基本使用——实现 Runnable接口
4. java让Runnable(传参)接受参数以及自定义方法
二、问题:Spring项目bean 无法注入问题–Thread中注入Bean无效-多线程下@Resource和@Autowired和@Value 注入为null
1、解决方法1
线程内无法被注入注解方法,除非是传参给多线程,即在线程启动前,在主线程代码下,以参数的形式获取注解值(例如@Resource
和@Autowired
和@Value
等注解方法),然后作为参数传递给子线程们。
// 子线程方法
public class TestThread implements Runnable{
private String data;
public TestThread(String data){
this.data = data;
}
@Override
public void run() {
System.err.println("传递给子线程的数据:" + data)
}
}
// 父线程
public class Test {
@Value("${test.data}")
private String data;
public String testFunction(){
List<Thread> threads = new ArrayList<>(3);
for(int i=0;i<3;i++){
String newData = "第" + i + "号 " + data
threads.add(new Thread(new TestThread(newData )));
}
for (Thread thread : threads) {
thread.start();
}
for (Thread thread : threads) {
thread.join();
}
}
}
2、解决方法2
Spring项目bean 无法注入问题–Thread中注入Bean无效
以上链接存在另外的解决方案:
将线程类作为服务类的内部类,可以方便直接使用外部类中注入的bean.
@Service
public class GuanLinSyncQueue{
private Logger logger = Logger.getLogger(GuanLinSyncQueue.class);
private static final String qianchuanCommunityCode = Global.getConfig("qianchuanCommunityCode");
@Autowired
private YwBuildingService ywBuildingService;
@PostConstruct
public void init() {
new worker().start();
}
private class worker extends Thread{
@Override
public void run() {
//做自己想做的事情
ywBuildingService.save(ywBuildingPojo);
}
}
}
参考链接
SpringBoot多线程下的bean管理——SpringBoot中多线程用Autowired或@Resource注入bean失败报NullPointException