Java -多线程深入理解与实现、多线程参数传递、多线程下注入Bean无效,如@Resource和@Autowired和@Value 注入为null

一、Java 多线程深入理解与创建、多线程参数传递的教程链接:

1. Java 17 多线程之 Runnable 知识点

2. 【Java】线程基本使用——实现 Runnable接口

3. java多线程(二)实现Runnable接口

4. java让Runnable(传参)接受参数以及自定义方法

5. 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

Spring项目bean 无法注入问题–Thread中注入Bean无效

java疑难杂症:多线程下@Resource和@Autowired和@Value 注入为null的解决办法