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

  

<强>前言

  

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

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

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

  

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

  

<强>改造前

  

程序逻辑

  

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

  

顺序执行任务png

  

<强>改造后

  

程序逻辑

  

 SpringBoot CountDownLatch多任务并行处理的实现方法”> <br/>
  </p>
  <p>多任务并行处理png </p>
  <p>多任务并行处理,适用于多核CPU、单多核CPU线程执行任务可能会适得其反(上下文切换以及线程的创建和销毁都会消耗资源),特别是CPU密集型的任务。</p>
  <p>代码实现</p>
  <p> StatsDemo伪代码:</p>
  
  <pre类=/* *   *多任务并行统计   *创建者科帮网   *创建时间2018年4月16日   */公开课StatsDemo {   最终的静态SimpleDateFormat自卫队=new SimpleDateFormat (   “yyyy-MM-dd HH: mm: ss”);      最终的静态字符串开始时间=自卫队。格式(新日期());      公共静态void main (String [] args)抛出InterruptedException {   CountDownLatch门闩=new CountDownLatch(5);//两个赛跑者   统计stats1=新数据(“任务“,1000年,门闩);   统计stats2=新数据(“任务B”, 2000年,门闩);   统计stats3=新数据(“任务C”, 2000年,门闩);   统计stats4=新数据(“任务D”, 2000年,门闩);   统计stats5=新数据(“任务E”, 2000年,门闩);   stats1.start();//任务一开始执行   stats2.start();//任务B开始执行   stats3.start();//任务C开始执行   stats4.start();//任务D开始执行   stats5.start();//任务E开始执行   latch.await();//等待所有人任务结束   system . out。println(“所有的统计任务执行完成:“+自卫队。新日期格式(()));   }      静态类数据扩展线程{   字符串statsName;   int运行时;   CountDownLatch门闩;      公共数据(字符串statsName, int运行时,CountDownLatch门闩){   这一点。statsName=statsName;   this.runTime=运行时;   这一点。门闩=门闩;   }      公共空间run () {   尝试{   system . out。println (statsName +“做统计开始”+开始时间);//模拟任务执行时间   thread . sleep(运行时);   system . out。println (statsName +“做统计完成”+自卫队。新日期格式(()));   latch.countDown();//单次任务结束,计数器减一   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   }   }      

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

  

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

  

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

  

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

  

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

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