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

网友投稿 285 2023-02-08


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

前言

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

个人排名

本次测试的优良线、及格线、低分线

各个班级的排名人数(1-25、26-50 类比等等)

各个班级的前X名人数统计(前10、前20 类比等等)

各个班级的分数段学生人数统计(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, lFQudJxaaatch);

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:图片管理api接口(图片API接口)
下一篇:登录时重新连接共享文件夹(共享文件夹移动后还需要重新连接吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~