zoukankan      html  css  js  c++  java
  • 多线程的运用

      

    @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);
    }
    }
    }
    }
  • 相关阅读:
    一个完整的Oracle建表的例子
    【转】oracle 体系结构
    JMeter-Window10系统下设置环境变量
    JMeter 3.0 POST Body Data 中文乱码问题
    JMeter接口测试报错,反馈和postman不一样(二)
    JMeter参数文件的相对路径
    JMeter正则表达式提取器说明
    JMeter接口测试报错,反馈和postman不一样(一)
    协程实现多边同时交互原理
    python 多线程中子线程和主线程相互通信
  • 原文地址:https://www.cnblogs.com/pxzbky/p/14455593.html
Copyright © 2011-2022 走看看