SpringBoot CountDownLatch多任务并行处理的实现方法

 更新时间:2018年04月22日 15:36:52   作者:小柒  
本篇文章主要介绍了SpringBoot CountDownLatch多任务并行处理的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前言

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

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

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

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

改造前

程序逻辑

顺序执行任务.png

改造后

程序逻辑


多任务并行处理.png

多任务并行处理,适用于多核CPU,单核CPU多线程执行任务可能会适得其反(上下文切换以及线程的创建和销毁都会消耗资源),特别是CPU密集型的任务。

代码实现

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,将他们自己拦住,直至锁存器计数结束。

具体的源码解读,大家可以参考: 源码分析之CountDownLatch

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解

    这篇文章主要介绍了java 查找list中重复数据实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java tomcat环境变量及idea配置解析

    Java tomcat环境变量及idea配置解析

    这篇文章主要介绍了Java tomcat环境变量及idea配置解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 详解最简单易懂的Spring Security 身份认证流程讲解

    详解最简单易懂的Spring Security 身份认证流程讲解

    这篇文章主要介绍了详解最简单易懂的Spring Security 身份认证流程讲解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Spring Security将用户数据存储到数据库的方法

    Spring Security将用户数据存储到数据库的方法

    这篇文章主要介绍了Spring Security将用户数据存储到数据库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java PTA 计算3到7位 水仙花数实例

    Java PTA 计算3到7位 水仙花数实例

    这篇文章主要介绍了Java PTA 计算3到7位 水仙花数实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot实现多文件上传的详细示例代码

    SpringBoot实现多文件上传的详细示例代码

    文件上传中并没有什么太多的知识点,下面这篇文章主要给大家介绍了关于SpringBoot实现多文件上传的详细示例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 利用Java实体bean对象批量数据传输处理方案小结

    利用Java实体bean对象批量数据传输处理方案小结

    javabean是对面向对象思想的一种具体实施的表现,本文重点给大家介绍利用Java实体bean对象批量数据传输处理方案小结,本文通过两种方案给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • springboot返回图片流的实现示例

    springboot返回图片流的实现示例

    本文主要介绍了springboot返回图片流的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java实现弹窗效果的基本操作(2)

    Java实现弹窗效果的基本操作(2)

    这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 详解BeanUtils.copyProperties()方法如何使用

    详解BeanUtils.copyProperties()方法如何使用

    这篇文章主要为大家介绍了详解BeanUtils.copyProperties()方法如何使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论