前言
最近在公司碰到这么一个需求,需要去1000多个数据库中统计数据,每次统计数据库中10多张表,当我们同事写出代码后,由于单线程去执行,效率有点慢,所以想出用多线程进行查询,这样以来可以提升一下查询效率。代码如下。
封装线程查询类
public class StatisticalUserBehaviorData implements Callable<List<Map<String, Object>>> {
private DataDao dataDao;
private Map<String,String> map;
//利用构造函数,将相关参数穿进来
public StatisticalUserBehaviorData(Map<String,String> map, DataDao dataDao){
this.map=map;
this.dataDao=dataDao;
}
@Override
public List<Map<String, Object>> call() throws Exception {
List<Map<String, Object>> resultList = new ArrayList<>();
//此处写具体的业务查询代码,可以查询数据库,也可以查询远程服务
resultList.add("这里是相关业务的查询结果");
return resultList;
}
}
外部调用
//汇总查询后的结果
List<Map<String, Object>> resultList = new ArrayList<>();
List<Future<List<Map<String, Object>>>> submitList = new ArrayList<>();
for (Map<String, String> map : projectList) {
//ExecutorService 是自己封装的线程池对象
submitList.add(ExecutorService.submit(new StatisticalUserBehaviorData(map,dataDao)));
}
for (Future<List<Map<String, Object>>> future : submitList) {
try {
resultList.addAll(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
结果
相比单线程执行的效率,多线程执行比单线程提升了5倍多,具体业务逻辑代码大家可以根据自己的场景自己写,比如查询多个服务,查询多张表,查询多个库等等。