Stream流中使用的Fork/Join框架

Fork/Join简单案例:
使用Fork/join计算1-10000的和
当一个任务的计算数量大于3000的时候拆分任务,数量小于3000的时候就计算
package com.tuling.stream; import java.time.Duration; import java.time.Instant; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class StreamTest10 { /** * 使用Fork/join计算1-10000的和 * 当一个任务的计算数量大于3000的时候拆分任务 * 数量小于3000的时候就计算 * @param args */ public static void main(String[] args) { Instant startTime = Instant.now(); ForkJoinPool pool = new ForkJoinPool(); SumRecursiveTask task = new SumRecursiveTask(1, 10000L); Long result = pool.invoke(task); System.out.println("result = " + result); Instant endTime = Instant.now(); long millis = Duration.between(startTime, endTime).toMillis(); System.out.println("总耗时: " + millis); } } class SumRecursiveTask extends RecursiveTask<Long> { // 定义一个拆分的临界值 private static final long THRESHOLD = 3000L; private final long start; private final long end; public SumRecursiveTask(long start, long end) { this.start = start; this.end = end; } @Override protected Long compute() { long length = end - start; if (length <= THRESHOLD) { // 任务不用拆分,可以计算 long sum = 0; for (long i = start; i < end; i++) { sum += i; } System.out.println("计算" + start + "--->" + end + "的结果为:" + sum); return sum; } else { // 数量大于预定的数量,那说明任务还需要继续拆分 long middle = (start + end) / 2; System.out.println("拆分:左边" + start + "--->" + middle + ",右边" + (middle + 1) + "--->" + end); SumRecursiveTask left = new SumRecursiveTask(start, middle); left.fork(); SumRecursiveTask right = new SumRecursiveTask(middle + 1, end); right.fork(); return left.join() + right.join(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2021-09-04 hive小练习_联合查询