Compute

分隔符

  1. // 将 _ 作为数字的分隔符 以下为 10亿
  2. for (Long i = 1L; i <= 10_0000_0000; i++) {
  3. sum += i;
  4. }

ForkJoin

并行执行任务!提高效率。大数据量! 大数据:Map Reduce (把大任务拆分为小任务)

image.png

ForkJoin 特点:工作窃取

这个里面维护的都是双端队列 image.png

  1. package com.zy.forkjoin;
  2. import java.util.concurrent.RecursiveTask;
  3. /**
  4. * 求和计算的任务!
  5. *
  6. * // 使用 forkjoin
  7. * // 1、forkjoinPool 通过它来执行
  8. * // 2、计算任务 forkjoinPool.execute(ForkJoinTask task)
  9. * // 3、计算类要继承 ForkJoinTask
  10. * @author zhangyu
  11. */
  12. public class ForkJoinDemo extends RecursiveTask<Long> {
  13. // 初始值 1
  14. private Long start;
  15. // 结束值 1990900000
  16. private Long end;
  17. // 临界值
  18. private Long temp = 10000L;
  19. public ForkJoinDemo(Long start, Long end) {
  20. this.start = start;
  21. this.end = end;
  22. }
  23. // 计算方法
  24. @Override
  25. protected Long compute() {
  26. if ((end - start) < temp) {
  27. Long sum = 0L;
  28. for (Long i = start; i <= end; i++) {
  29. sum += i;
  30. }
  31. return sum;
  32. } else {
  33. // 中间值
  34. long middle = (start + end) / 2;
  35. ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
  36. task1.fork(); // 拆分任务,把任务压入线程队列
  37. ForkJoinDemo task2 = new ForkJoinDemo(middle + 1, end);
  38. task2.fork(); // 拆分任务,把任务压入线程队列
  39. return task1.join() + task2.join();
  40. }
  41. }
  42. }
  1. import java.util.concurrent.ExecutionException;
  2. import java.util.concurrent.ForkJoinPool;
  3. import java.util.concurrent.ForkJoinTask;
  4. import java.util.stream.DoubleStream;
  5. import java.util.stream.IntStream;
  6. import java.util.stream.LongStream;
  7. /**
  8. * 效率高几十倍!
  9. * @author zhangyu
  10. */
  11. public class Test {
  12. public static void main(String[] args) throws ExecutionException, InterruptedException {
  13. // test1(); // 12224
  14. // test2(); // 10038
  15. // test3(); // 153
  16. }
  17. // 普通程序员
  18. public static void test1(){
  19. Long sum = 0L;
  20. long start = System.currentTimeMillis();
  21. for (Long i = 1L; i <= 10_0000_0000; i++) {
  22. sum += i;
  23. }
  24. long end = System.currentTimeMillis();
  25. System.out.println("sum="+sum+" 时间:"+(end-start));
  26. }
  27. // 使用ForkJoin
  28. public static void test2() throws ExecutionException, InterruptedException {
  29. long start = System.currentTimeMillis();
  30. ForkJoinPool forkJoinPool = new ForkJoinPool();
  31. ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);
  32. ForkJoinTask<Long> submit = forkJoinPool.submit(task);// 提交任务
  33. Long sum = submit.get();
  34. long end = System.currentTimeMillis();
  35. System.out.println("sum="+sum+" 时间:"+(end-start));
  36. }
  37. public static void test3(){
  38. long start = System.currentTimeMillis();
  39. // Stream并行流 ()
  40. long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
  41. long end = System.currentTimeMillis();
  42. System.out.println("sum="+"时间:"+(end-start));
  43. }
  44. }