SpringBoot开发案例之CountDownLatch多任务并行处理

简介: 前言 最近在做一个原始成绩统计的功能,用户通过前台设置相关参数,后台实时统计并返回数据。相对来说统计功能点还是比较多的,这里大体罗列一下。 个人排名 本次测试的优良线、及格线、低分线 各个班级的排名人数(1-25、26-50 类比等等) 各个班级的前X名人数统计(前10、前20 类比等等) 各个班级的分数段学生人数统计(150-140、139-130 类比等等) 最好的用户体验,就是每一个操作都可以实时的展示数据,3秒之内应该是用户的忍受范围之内的了,所以做一款产品不仅要考虑用户交互设计,后端的优化也是比不可少的。

008

前言

最近在做一个原始成绩统计的功能,用户通过前台设置相关参数,后台实时统计并返回数据。相对来说统计功能点还是比较多的,这里大体罗列一下。

  • 个人排名
  • 本次测试的优良线、及格线、低分线
  • 各个班级的排名人数(1-25、26-50 类比等等)
  • 各个班级的前X名人数统计(前10、前20 类比等等)
  • 各个班级的分数段学生人数统计(150-140、139-130 类比等等)

最好的用户体验,就是每一个操作都可以实时的展示数据,3秒之内应该是用户的忍受范围之内的了,所以做一款产品不仅要考虑用户交互设计,后端的优化也是比不可少的。

大家可以简单的看下以上这5项统计数据,总体来说,统计量还是不少的。最主要的还是要实时、实时、实时(重要的事情说三遍),显然定时任务是不现实的。

改造前

程序逻辑

_

改造后

程序逻辑

_

代码实现

StatsDemo伪代码:

/**
 * 多任务并行统计
 * 创建者 科帮网
 * 创建时间    2018年4月16日
 */
public class StatsDemo {
    final static SimpleDateFormat sdf = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");
    
    final static String startTime = sdf.format(new Date());

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(5);// 两个赛跑者
        Stats stats1 = new Stats("任务A", 1000, latch);
        Stats stats2 = new Stats("任务B", 2000, latch);
        Stats stats3 = new Stats("任务C", 2000, latch);
        Stats stats4 = new Stats("任务D", 2000, latch);
        Stats stats5 = new Stats("任务E", 2000, latch);
        stats1.start();//任务A开始执行
        stats2.start();//任务B开始执行
        stats3.start();//任务C开始执行
        stats4.start();//任务D开始执行
        stats5.start();//任务E开始执行
        latch.await();// 等待所有人任务结束
        System.out.println("所有的统计任务执行完成:" + sdf.format(new Date()));
    }

    static class Stats extends Thread {
        String statsName;
        int runTime;
        CountDownLatch latch;

        public Stats(String statsName, int runTime, CountDownLatch latch) {
            this.statsName = statsName;
            this.runTime = runTime;
            this.latch = latch;
        }

        public void run() {
            try {
                System.out.println(statsName+ " do stats begin at "+ startTime);
                //模拟任务执行时间
                Thread.sleep(runTime);
                System.out.println(statsName + " do stats complete at "+ sdf.format(new Date()));
                latch.countDown();//单次任务结束,计数器减一
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

由于要同步返回统计数据,这里我们使用到了CountDownLatch类,它是Java5中新增的一个并发工具类,其使用非常简单,参考上面的伪代码给出了详细的使用步骤。

CountDownLatch用于同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成。CountDownLatch典型的用法是将一个程序分为N个互相独立的可解决任务,并创建值为N的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。

具体的源码解读,大家可以参考:【JUC】JDK1.8源码分析之CountDownLatch

项目源码:https://gitee.com/52itstyle/spring-data-jpa

作者: 小柒2012

欢迎关注: https://blog.52itstyle.com

目录
相关文章
|
1月前
|
druid Java 数据库
Spring Boot的定时任务与异步任务
Spring Boot的定时任务与异步任务
|
29天前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
23 0
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
18天前
|
Java Spring
SpringBoot+async异步调用接口以及几个任务同时完成和异步接口实现和调用
SpringBoot+async异步调用接口以及几个任务同时完成和异步接口实现和调用
20 0
|
23天前
|
前端开发 Java 微服务
SpringBoot 企业级简化开发(一)
SpringBoot 企业级简化开发
95 1
|
2月前
day01_springboot综合案例(三)
day01_springboot综合案例
13 0
|
2月前
|
SQL
day01_springboot综合案例(二)
day01_springboot综合案例
48 0
|
2月前
|
SQL Java 数据库
day01_springboot综合案例(一)
day01_springboot综合案例
61 0
day01_springboot综合案例(一)
|
2月前
day02_springboot综合案例(三)
day02_springboot综合案例
25 0
|
2月前
day02_springboot综合案例(二)
day02_springboot综合案例
32 0