Compute
分隔符
// 将 _ 作为数字的分隔符 以下为 10亿for (Long i = 1L; i <= 10_0000_0000; i++) {sum += i;}
ForkJoin
并行执行任务!提高效率。大数据量! 大数据:Map Reduce (把大任务拆分为小任务)

ForkJoin 特点:工作窃取
这个里面维护的都是双端队列
![]()
package com.zy.forkjoin;import java.util.concurrent.RecursiveTask;/*** 求和计算的任务!** // 使用 forkjoin* // 1、forkjoinPool 通过它来执行* // 2、计算任务 forkjoinPool.execute(ForkJoinTask task)* // 3、计算类要继承 ForkJoinTask* @author zhangyu*/public class ForkJoinDemo extends RecursiveTask<Long> {// 初始值 1private Long start;// 结束值 1990900000private Long end;// 临界值private Long temp = 10000L;public ForkJoinDemo(Long start, Long end) {this.start = start;this.end = end;}// 计算方法@Overrideprotected Long compute() {if ((end - start) < temp) {Long sum = 0L;for (Long i = start; i <= end; i++) {sum += i;}return sum;} else {// 中间值long middle = (start + end) / 2;ForkJoinDemo task1 = new ForkJoinDemo(start, middle);task1.fork(); // 拆分任务,把任务压入线程队列ForkJoinDemo task2 = new ForkJoinDemo(middle + 1, end);task2.fork(); // 拆分任务,把任务压入线程队列return task1.join() + task2.join();}}}
import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.stream.DoubleStream;import java.util.stream.IntStream;import java.util.stream.LongStream;/*** 效率高几十倍!* @author zhangyu*/public class Test {public static void main(String[] args) throws ExecutionException, InterruptedException {// test1(); // 12224// test2(); // 10038// test3(); // 153}// 普通程序员public static void test1(){Long sum = 0L;long start = System.currentTimeMillis();for (Long i = 1L; i <= 10_0000_0000; i++) {sum += i;}long end = System.currentTimeMillis();System.out.println("sum="+sum+" 时间:"+(end-start));}// 使用ForkJoinpublic static void test2() throws ExecutionException, InterruptedException {long start = System.currentTimeMillis();ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);ForkJoinTask<Long> submit = forkJoinPool.submit(task);// 提交任务Long sum = submit.get();long end = System.currentTimeMillis();System.out.println("sum="+sum+" 时间:"+(end-start));}public static void test3(){long start = System.currentTimeMillis();// Stream并行流 ()long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);long end = System.currentTimeMillis();System.out.println("sum="+"时间:"+(end-start));}}
