Javaマルチスレッドの使用心得

1960 ワード

最近、ボスはビッグデータテーブルの統計をする必要があります.統計ロジックは複雑です.最初は一般的な循環ロジックを使って統計をしていましたが、それが遅すぎることに気づきました.その後、マルチスレッドを考えました.以前は使ったことがありませんでした.だから、石を触って川を渡って、心得をまとめました.
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;
	}
}