多线程的运用

  

@Override
public AnalysisPO analysis(String type, String cantonName, String cantonId) {
long t1 = System.currentTimeMillis();
StringBuffer redisKey = new StringBuffer(RedisConstants.REDIS_KEY_INNER_RESOURCE).append(":").append(type).append(":").append(cantonName);//缓存key值
log.info("路内资源利用核心数据key:" + redisKey);

AnalysisPO analysis = (AnalysisPO) redisTemplate.opsForHash().get(redisKey.toString(), type);
if (analysis == null) {
SimpleDateFormat sdf = null;
String formats = null;
String table1 = null;
String stime = null;
String etime = null;
String stime2 = null;
if (type.equals("1")) {
//今日24小时
table1 = "new_road_inner_resource_hours";
formats = "%H";
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
stime = sdf.format(DateUtils.getDayBegin());
etime = sdf.format(DateUtils.getDayEnd());
stime2 = sdf.format(DateUtils.getLastHour());//前一个小时

} else if (type.equals("2")) {
//近30天
table1 = "new_road_inner_resource_day";
sdf = new SimpleDateFormat("yyyy-MM-dd");
stime = sdf.format(DateUtils.getBeginDayOfMonthAgo());
etime = sdf.format(DateUtils.getEndDayOfYesterDay());
} else if (type.equals("3")) {
//近12个月
table1 = "new_road_inner_resource_month";
sdf = new SimpleDateFormat("yyyy-MM");
stime = sdf.format(DateUtils.getPastYearBegin());
etime = sdf.format(DateUtils.getLastMonthBegin());

} else {
throw new RuntimeException("传入的类型有误");
}
log.info("时间:" + stime + "~" + etime);
//*****************多线程执行任务
ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 1; i <= 7; i++) {
pool.execute(new AnalysisTask(i, result, table1, stime, etime, cantonName, stime2, formats));
}

pool.shutdown();
while (true) {
if (pool.isTerminated()) {

log.info("路内资源利用核心数据添加至缓存:" + result.toString());
//存入缓存
redisTemplate.opsForHash().put(redisKey.toString(), type, result);
if (type.equals("1")) {
redisTemplate.expire(redisKey.toString(), 1, TimeUnit.HOURS);//缓存有效时间
} else {
redisTemplate.expire(redisKey.toString(), 1, TimeUnit.DAYS);//缓存有效时间
}
analysis = result;
break;
}
}

}
//type=1时(按天),实时饱和度需要查询宜停车的实时饱和度 add by xuxiaomin/2021.02.06
try {
if (type.equals("1")) {
CommonDto cd = new CommonDto();
cd.setCantonId(cantonId);
CantonBerthPO cantonSat = queryCantonBerthByRealTime(cd);
String rate = cantonSat.getRate();
analysis.setMaxSaturation(rate);
}
//
} finally {
long t2 = System.currentTimeMillis() - t1;
log.info("运行时间:" + t2 / 1000 + "毫秒");
return analysis;
}

}


 class AnalysisTask implements Runnable {
private Integer i;
private AnalysisPO result;
private String table1;
private String stime;
private String etime;
private String cantonName;
private String stime2;
private String formats;

public AnalysisTask(int i, AnalysisPO ana, String table1, String stime, String etime, String cantonName, String stime2, String formats) {
this.i = i;
this.result = ana;
this.table1 = table1;
this.stime = stime;
this.etime = etime;
this.cantonName = cantonName;
this.stime2 = stime2;
this.formats = formats;
}

@Override
public synchronized void run() {

if (i == 1) {
AnalysisPO analysisPO = newRoadInnerResourceMapper.queryMaxAndAvg(table1, stime, etime, cantonName, stime2);//最大值和平均值
if (analysisPO != null) {
// result = analysisPO;
String maxSat = analysisPO.getMaxSaturation();
String avgSat = analysisPO.getAvgSaturation();
double maxVit = analysisPO.getMaxVitality();
double avgVit = analysisPO.getAvgVitality();
double maxPark = analysisPO.getMaxParkingTime();
double avgPark = analysisPO.getAvgParkingTime();
if (maxSat != null) {
if (maxSat.contains("%")) {
maxSat = maxSat.substring(0, maxSat.length() - 1);
}
}
result.setMaxSaturation(maxSat == null ? "0" : maxSat);
result.setAvgSaturation(avgSat == null ? "0" : avgSat);
result.setMaxVitality(maxVit);
result.setAvgVitality(avgVit);
result.setMaxParkingTime(maxPark);
result.setAvgParkingTime(avgPark);
}
} else if (i == 2) {
Map<String, String> map1 = getSaturabilityMap(table1, stime, etime, cantonName);//饱和度占比
if (map1 != null && map1.size() != 0) {
result.setSaturationMap(map1);
}

} else if (i == 3) {
Map<String, String> map2 = getLevelParkingTime(cantonName, table1, stime, etime);//平均停车时长占比
if (map2 != null && map2.size() != 0) {
result.setParkTimeMap(map2);
}
} else if (i == 4) {
List<TimeTurnPO> vatList = newRoadInnerResourceMapper.getTimeTurnAndUsage(table1, stime, etime, cantonName);//活力指数分布
if (vatList != null && vatList.size() != 0) {
result.setVitalList(vatList);
}


} else if (i == 5) {
List<VitalPO> siteList = newRoadInnerResourceMapper.getSiteVital(table1, stime, etime, cantonName);//站点饱和度、活力指数热力图数据
if (siteList != null && siteList.size() != 0) {
result.setHeatList(siteList);
}
} else if (i == 6) {
List<TrendPO> timeList = newRoadInnerResourceMapper.getTimeTrend(formats, table1, stime, etime, cantonName);//时间趋势
if (timeList != null && timeList.size() != 0) {
result.setTimeList(timeList);
}
} else if (i == 7) {
Map<String, List<IndexTypePO>> indexMap = new HashMap<>();
//7 饱和度指数级别统计
getSaturabilityList(cantonName, table1, stime, etime, indexMap);
//8 活力指数级别统计
getVitalityList(cantonName, table1, stime, etime, indexMap);
//9 停车时长指数级别统计
getParkTimeList(cantonName, table1, stime, etime, indexMap);
if (null != indexMap && indexMap.size() != 0) {
result.setIndexList(indexMap);
}
}
}
}
原文地址:https://www.cnblogs.com/pxzbky/p/14455593.html