思路:
1:参考分页方式将数据拆成指定大小线程数
2:在每个独立的线程中去读取数据并处理数据
步骤一实现
步骤二实现
1:参考分页方式将数据拆成指定大小线程数
2:在每个独立的线程中去读取数据并处理数据
步骤一实现
public class IndexIntiTools {
public static AtomicInteger runflag=new AtomicInteger();
//用于测试
public static List<Object> syncList=new CopyOnWriteArrayList<Object>();
private static int idxThreadCount = 10;
private static Executor ex = Executors.newFixedThreadPool(idxThreadCount);
/**
* 构建索引
* @param hql
* @param size
*/
public static void build(String hql, int size) {
int pagecount = idxThreadCount;
int count = size / pagecount;
int mod = size % pagecount;
List<Runnable> runList = new ArrayList<Runnable>(pagecount);
IndexExecutor idxExecutor;
for (int i = 0; i < pagecount; i++) {
if (i == (pagecount - 1)) {
idxExecutor = new IndexExecutor(hql, i * count, count + mod);
} else {
idxExecutor = new IndexExecutor(hql, i * count, count);
}
runList.add(idxExecutor);
}
for (Runnable runnable : runList) {
runflag.incrementAndGet();
ex.execute(runnable);
}
}
}
步骤二实现
public class IndexExecutor implements Runnable{
private static final Log log = LogFactory.getLog(IndexExecutor.class);
private int start;
private int limit;
private String hql;
public IndexExecutor(String hql,int start, int limit) {
this.hql=hql;
this.start = start;
this.limit = limit;
}
@Override
public void run() {
log.info("hql:"+hql+",start:"+start+",limit"+limit);
//查询数据库(hql,start,limit);
log.info(list);
IndexIntiTools.syncList.addAll(list);
IndexIntiTools.runflag.decrementAndGet();
}
}