Javaマルチスレッドの使用心得
1960 ワード
最近、ボスはビッグデータテーブルの統計をする必要があります.統計ロジックは複雑です.最初は一般的な循環ロジックを使って統計をしていましたが、それが遅すぎることに気づきました.その後、マルチスレッドを考えました.以前は使ったことがありませんでした.だから、石を触って川を渡って、心得をまとめました.
1、スレッドのデータ転送、スレッドの構築方法を書き換え、すべてのパラメータを一括転送
2、スレッド起動処理、上層forサイクル中にいくつかのスレッド同時処理を起動する
質問:
データ量が大きすぎるとメモリが限られ、スレッドが遅い場合もあり、処理に時間がかかる場合もあります.
スレッドのコードを貼ると、やはり問題があると感じて、研究しています.
1、スレッドのデータ転送、スレッドの構築方法を書き換え、すべてのパラメータを一括転送
2、スレッド起動処理、上層forサイクル中にいくつかのスレッド同時処理を起動する
質問:
データ量が大きすぎるとメモリが限られ、スレッドが遅い場合もあり、処理に時間がかかる場合もあります.
スレッドのコードを貼ると、やはり問題があると感じて、研究しています.
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;
}
}