多线程中引入Spring自动注入的对象为null
2014-11-13 11:31
501 查看
转载自:http://blog.csdn.net/majian_1987/article/details/8157668
线程类:
public class ZgAreaDataThread extends Thread {
调用线程类:
public void UseThread(List<ZgAreaData> list){
int recordsInThread = 50000;//每个线程操作数据量
int threadCount = list.size()/recordsInThread;
List<ZgAreaDataThread> threadList = new ArrayList<ZgAreaDataThread>();
for(int i = 0; i <= threadCount; i++){
ZgAreaDataThread myThread = null;
if(i == threadCount){
myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, list.size()));
}else{
myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, i*recordsInThread+999));
}
myThread.setName("Thread"+(i+1));
threadList.add(myThread);
myThread.start();
}
}
笔者一开始这样写线程时 zgAreaDataService一直是null, 后来查阅资料时才知道
因为线程是一个普通的java类,你new了一个线程,线程启动时没有用到Spring实例池。所以注入的变量值都为null,需重新获取spring bean才可以。
但是如果在run方法里面加载application.xml,来取得bean时,由于重复加载,一般情况下会耗尽内存,抛出内存溢出错误。
上面是一种方法,笔者没试过, 但是项目有用到过。另一种方法就是:
可以通过在new ZgAreaDataThread的时候把 zgAreaDataService作为构造参数传递给ZgAreaDataThread,代码如下:
线程类:
public class ZgAreaDataThread extends Thread {
private static ZgAreaDataService zgAreaDataService;
private List<ZgAreaData> list = new ArrayList<ZgAreaData>();
public ZgAreaDataThread(List<ZgAreaData> list, <span style="color:#ff0000;">ZgAreaDataService zgAreaDataService</span>){
this.list = list;
<span style="color:#ff0000;">this.zgAreaDataService = zgAreaDataService;</span>
}
public void run(){
zgAreaDataService.addAreaData(list);
}
}
线程开启
@Component
public class ReadDat {
@Reference(registry="real-registry")
private static ZgAreaDataService <span style="color:#ff0000;">zgAreaDataService</span>;
线程类:
public class ZgAreaDataThread extends Thread {
<span style="white-space:pre"> </span>@Reference(registry="real-registry") private static ZgAreaDataService zgAreaDataService; private List<ZgAreaData> list = new ArrayList<ZgAreaData>(); public ZgAreaDataThread(List<ZgAreaData> list){ this.list = list; } public void run(){ zgAreaDataService.addAreaData(list); } }
调用线程类:
public void UseThread(List<ZgAreaData> list){
int recordsInThread = 50000;//每个线程操作数据量
int threadCount = list.size()/recordsInThread;
List<ZgAreaDataThread> threadList = new ArrayList<ZgAreaDataThread>();
for(int i = 0; i <= threadCount; i++){
ZgAreaDataThread myThread = null;
if(i == threadCount){
myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, list.size()));
}else{
myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, i*recordsInThread+999));
}
myThread.setName("Thread"+(i+1));
threadList.add(myThread);
myThread.start();
}
}
笔者一开始这样写线程时 zgAreaDataService一直是null, 后来查阅资料时才知道
因为线程是一个普通的java类,你new了一个线程,线程启动时没有用到Spring实例池。所以注入的变量值都为null,需重新获取spring bean才可以。
但是如果在run方法里面加载application.xml,来取得bean时,由于重复加载,一般情况下会耗尽内存,抛出内存溢出错误。
上面是一种方法,笔者没试过, 但是项目有用到过。另一种方法就是:
可以通过在new ZgAreaDataThread的时候把 zgAreaDataService作为构造参数传递给ZgAreaDataThread,代码如下:
线程类:
public class ZgAreaDataThread extends Thread {
private static ZgAreaDataService zgAreaDataService;
private List<ZgAreaData> list = new ArrayList<ZgAreaData>();
public ZgAreaDataThread(List<ZgAreaData> list, <span style="color:#ff0000;">ZgAreaDataService zgAreaDataService</span>){
this.list = list;
<span style="color:#ff0000;">this.zgAreaDataService = zgAreaDataService;</span>
}
public void run(){
zgAreaDataService.addAreaData(list);
}
}
线程开启
@Component
public class ReadDat {
@Reference(registry="real-registry")
private static ZgAreaDataService <span style="color:#ff0000;">zgAreaDataService</span>;
//.....其他代码...
/** * 创建线程 * @param list */ public void UseThread(List<ZgAreaData> list){ int recordsInThread = 50000;//每个线程操作数据量 int threadCount = list.size()/recordsInThread; List<ZgAreaDataThread> threadList = new ArrayList<ZgAreaDataThread>(); for(int i = 0; i <= threadCount; i++){ ZgAreaDataThread myThread = null; if(i == threadCount){ myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, list.size()), <span style="color:#ff0000;">zgAreaDataService</span>); }else{ myThread = new ZgAreaDataThread(list.subList(i*recordsInThread, i*recordsInThread+999), <span style="color:#ff0000;">zgAreaDataService</span>); } myThread.setName("Thread"+(i+1)); threadList.add(myThread); myThread.start(); } } }
相关文章推荐
- 用spring的注解建立bean与bean之间的关系组件装配及自动注入依赖对象
- JUnit与Spring的整合——JUnit的TestCase如何自动注入Spring容器托管的对象
- 在多线程类中,Spring注入对象为null问题处理
- springboot在多线程中注入对象
- quartz 与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象
- Spring在多线程下@Resource注入为null
- Spring-方法注入、depends-on、自动装配协作对象
- Struts2,action中用spring注入,启动服务时注入成功,action运行时对象又变成null了
- activiti解决实现ExecutionListener spring 自动注入@Autowired为null问题
- Quartz与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象
- Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
- Quartz与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象
- Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
- JUnit与Spring的整合——JUnit的TestCase如何自动注入Spring容器托管的对象
- Quartz与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象
- spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象
- Spring多线程注入时报null异常
- 【JavaEE学习笔记】Spring_02_IoC/DI依赖注入,集合对象属性注入,自动装配,代理模式
- Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
- 第36天(就业班) spring引入、专业术语、spring六大模块、bean创建对象的细节、IOC容器、对象依赖关系、自动装配、注解方式