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