Java 多線程使用心得

最近老闆須要作一個大數據表的統計,統計邏輯比較複雜,一開始作的時候 僅僅使用了通常的循環邏輯進行統計,後來發現這樣實在是太慢了,後來想到了多線程,之前沒有用過,因此也是摸着石頭過河,總結心得以下:java

一、線程的數據傳入,重寫線程的構造方法,一次性傳入全部參數session

二、線程啓動處理,在上層for循環中啓動若干線程同時處理多線程


問題:oop

面對數據量過大時,內存有限,線程有時候也很慢,處理也比較的費時大數據

貼一下線程的代碼,感受仍是有問題,在研究研究this

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.model.OmLogAskDetail;
import com.service.AnalysisService;

public class LoopThread extends Thread {
	AnalysisService as = new AnalysisService();
	
	List<OmLogAskDetail> omLogAskDetailList;
	String key;
	List<String> list;
	
	public LoopThread(String key,List<String> list,List<OmLogAskDetail> omLogAskDetailList){
		this.key = key;
		this.list = list;
		this.omLogAskDetailList = omLogAskDetailList;
	}
	
	public void run(){
		System.out.println("進入線程 : "+this.getId()+" is running");
		Map<String,List<String>> questionMap = new HashMap<String, List<String>>();
		List<String> secondAskList = new ArrayList<String>();
		for(String id :list){
			List<OmLogAskDetail> _omLogAskDetailList = getSingleDialogList(id);
			if(_omLogAskDetailList.size()>1 &&_omLogAskDetailList.get(0).getFaqName().equals(key)){
				secondAskList.add(_omLogAskDetailList.get(1).getFaqName());
			}
		}
		questionMap.put(key, secondAskList);
		as.saveSecondAsk_sub(questionMap);
		System.out.println(key+" Thread "+this.getId()+" map size is : "+questionMap.size());
	}
	
	public List<OmLogAskDetail> getSingleDialogList(String sessionid){
		List<OmLogAskDetail> list = new ArrayList<OmLogAskDetail>();
		if(omLogAskDetailList.size()>0){
			for(OmLogAskDetail o:omLogAskDetailList){
				if(o.getSessionid().equals(sessionid)){
					list.add(o);
				}
			}
		}
		return list;
	}
}
相關文章
相關標籤/搜索