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