ForkJoin的使用

ForkJoin的使用目录前言前言 ForkJoin 是 JDK1 7 加入的多线程并行处理框架 ForkJoin 使用 分而治之 的思想 把一个大任务拆分成一个个小任务 然后再聚合 得到最终结果 这有点像 Hadoop 中的 MapReduce 还支持工作窃取

前言

  • ForkJoin是JDK1.7加入的多线程并行处理框架。ForkJoin使用分而治之的思想,把一个大任务拆分成一个个小任务,然后再聚合,得到最终结果。这有点像Hadoop中的MapReduce。还支持工作窃取。
  • 下面附上ForkJoin Java并发动画。

这个Jar包下载地址: https://sourceforge.net/projects/javaconcurrenta/files/,还有很多有意思的动画,帮助我们学习JUC。

在这里插入图片描述

什么是工作窃取:假设有A、B两个线程执行一个任务,A比较快,把活儿干完了,这时候A可以把B的一部分活接过来。这样总体来说会加快任务执行速度。

应用

需求

  • 假设有这样一个需求:我要统计用户表里全部的金额。这个表里有条数据。如果我直接用SQL统计很慢,如下图所示。
    在这里插入图片描述

  • 花费了4.563秒才查出来。
  • 我发现每次条还是很快的,如下图所示。
    在这里插入图片描述

  • 我就想是否可以写个程序,拆分成多个小任务,分批查询,然后合并结果。

使用

根据id范围查询求SUM

...省略... @Override public long sumRecord(int toId, int fromId) { QueryWrapper 
  
    queryWrapper = new QueryWrapper<>(); // 用in语句合并成一条SQL,避免多次请求数据库的IO queryWrapper.ge("id", fromId); queryWrapper.le("id", toId); queryWrapper.select("IFNULL(SUM(money),0) as money"); List 
   
     users = usersMapper.selectList(queryWrapper); if (!CollectionUtils.isEmpty(users)) { return users.get(0).getMoney(); } return 0; } ...省略... 
    
  

创建任务类和测试用例

 ...省略... @Test public void sumTask() { long startTime = System.currentTimeMillis(); ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); // 模拟千万数据 int min = 1; int max = ; SumTask sumTask = new SumTask(min, max, userService); pool.invoke(sumTask); System.out.println("总数 " + sumTask.join() + " 执行时间 " + (System.currentTimeMillis() - startTime)); } public static final Integer THRESHOLD = ; public static class SumTask extends RecursiveTask 
  
    { int fromId; int toId; private UserService userService; public SumTask(int fromId, int toId, UserService userService) { this.fromId = fromId; this.toId = toId; this.userService = userService; } @Override protected Long compute() { if (toId - fromId < THRESHOLD) { return sumRecord(toId, fromId); } else { int mid = (fromId + toId) / 2; SumTask left = new SumTask(fromId, mid, userService); SumTask right = new SumTask(mid + 1, toId, userService); invokeAll(left, right); return left.join() + right.join(); } } public Long sumRecord(int toId, int fromId) { System.out.println(" 参数 " + fromId + " " + toId); return userService.sumRecord(toId, fromId); } } ...省略... 
  

执行结果

  • 执行结果明显速度快了。
    在这里插入图片描述

小结

  • 我们可以在new ForkJoinPool(int parallelism)传入线程数(默认是CPU核心数),进行调优。
  • 如果是继承RecursiveAction:用于没有返回结果的任务。

完整代码

  • https://gitee.com/apple_/spring-boot-kubernetes/tree/v1.0.5
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212663.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:33
下一篇 2026年3月18日 下午7:33


相关推荐

  • msm8937之I2C配置

    msm8937之I2C配置msm8937.dtsi中aliases{i2c1=&i2c_1;i2c2=&i2c_2;i2c3=&i2c_3;i2c4=&i2c_4;i2c5=&i2c_5;i2c6=&i2c_6;i…

    2022年10月18日
    4
  • 读取EXCEL表格数据到MATLAB成为矩阵

    读取EXCEL表格数据到MATLAB成为矩阵读取 EXCEL 表格数据到 MATLAB 矩阵 data xlsread filename sheet range 其中 filename 为文件路径及文件名 sheet 为数据表名称 range 为数据的位置 如 A1 A1 A1 G11

    2026年3月18日
    2
  • pycharm怎么配置tensorflow环境_pycharm环境搭建

    pycharm怎么配置tensorflow环境_pycharm环境搭建Pycharm安装并搭建Tensorflow开发环境下载并安装pycharm1.下载2.pycharm配置python环境安装tensorflow1.输入清华仓库镜像2.创建tensorflow环境3.启动tensorflow环境4.安装cpu版本的TensorFlow5.测试TensorFlowPycharm中配置TensorFlow环境在操作之前先安装好python环境,我是安装的Anaconda,Anaconda下载安装教程可参考:https://blog.csdn.net/Chen_Meng_

    2022年8月26日
    8
  • 全排列 leetcode_leetcode top100

    全排列 leetcode_leetcode top100原题链接给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]题解回溯即可class Solution {public: vector<vector<int> >res; vector<int>t; void dfs(int num,int len,vecto

    2022年8月8日
    6
  • iframe跨域调用js_ajax跨域访问

    iframe跨域调用js_ajax跨域访问概述本地同一浏览器访问本地HTML文件和访问服务器端HTML文件,本地Iframe没有自适应高度,而服务器端的Ifrane自适应了高度。1.问题重现:Chrome版本41.0.2272.101(64-bit)OS:Win8.1Chrome访问服务器端HTML文件呈现的结果Chrome访问本地HTML文件呈现的结果本地访问的HTML文件Iframe没有根据Iframe里面的页面类容自适应高度2…

    2026年4月17日
    4
  • 性能测试中的TPS与HPS

    性能测试中的TPS与HPS性能测试中的 TPS 与 HPS nbsp TPS Transactionp 是估算应用系统性能的重要依据 其意义是应用系统每秒钟处理完成的交易数量 一般的 评价系统性能均以每秒钟完成的技术交易的数量来衡量 系统整体处理能力取决于处理能力最低模块的 TPS 值 依据经验 应用系统的处理能力一般要求在 10 100 左右 不同应用系统的 TPS 有着十分大的差别 一般需要通过性能测试进

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号