您的位置:首页 > 编程语言 > Java开发

多线程中引入Spring自动注入的对象为null

2014-11-13 11:31 501 查看
转载自:http://blog.csdn.net/majian_1987/article/details/8157668

线程类:

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();
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐