JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例
SumTask.java
import java.util.concurrent.RecursiveTask; /** * 定义任务和拆分逻辑 * RecursiveTask<Long> 这个是 有返回值的 * 如果不需要返回值可以用 RecursiveAction */ public class SumTask extends RecursiveTask<Long> { /** * 累加的开始值 */ private int begin; /** * 累加的结束值 */ private int end; public SumTask(int begin, int end) { this.begin = begin; this.end = end; } @Override protected Long compute() { long sum = 0; if (end - begin < 100) { //如果两个数值小于100,就不要继续拆分了 直接相加就行 for (int i = begin; i <= end; i++) { sum += i; } return sum; } else { //如果大于100继续拆分 取中间数拆分 int middle = (begin + end) / 2; SumTask sumTask1 = new SumTask(begin, middle); SumTask sumTask2 = new SumTask(middle + 1, end); //分别执行子任务 sumTask1.fork(); sumTask2.fork(); //取出子任务执行的结果 Long sum1 = sumTask1.join(); Long sum2 = sumTask2.join(); //相加 return sum1 + sum2; } } }
使用
public static void main(String[] args) { ForkJoinPool pool=new ForkJoinPool(4); SumTask sumTask=new SumTask(1,10000); //直接获取值 Long sum = pool.invoke(sumTask); System.out.println(sum); ForkJoinTask<Long> task = pool.submit(sumTask); if (task.isCompletedAbnormally()) { //发生异常 打印 System.out.println(task.getException()); } }
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-06-02 Gson使用@JsonAdapter自定义序列化简单demo
2020-06-02 JAVA实现调用默认浏览器打开网页