1 import java.util.concurrent.ForkJoinPool; 2 import java.util.concurrent.ForkJoinTask; 3 import java.util.stream.LongStream; 4 5 /** 6 * @author 7 * @version V1.0 8 * @Package 9 * @date 2020/5/14 10:13 10 */ 11 // 任务合并 框架 RecursiveTask 12 public class ForkJoinSumCalculator extends java.util.concurrent.RecursiveTask<Long> { 13 // 要求和的数组 14 private final long[] numbers; 15 // 子任务的数组起始位置 和截至位置 16 private final int start; 17 private final int end; 18 // 数组内容低于 该值 则不再拆分 19 public static final long THRESHOLD = 10000; 20 21 22 private ForkJoinSumCalculator(long[] numbers, int start, int end) { 23 this.numbers = numbers; 24 this.start = start; 25 this.end = end; 26 } 27 28 public ForkJoinSumCalculator(long[] numbers) { 29 this(numbers,0,numbers.length); 30 } 31 32 33 // 复写方法求和 34 @Override 35 protected Long compute() { 36 int length = end - start; 37 //如果内容 小于指定阈值 则不做拆分 直接返回求和结果 38 if (length <= THRESHOLD) { 39 return computeSequentially(); 40 } 41 // 大于阈值 则 拆分成两个 不同的任务子进程 单独求和 42 ForkJoinSumCalculator leftTask = 43 new ForkJoinSumCalculator(numbers, start, start + length/2); 44 // 利用一个新的线程来计算该子任务的求和 45 leftTask.fork(); 46 ForkJoinSumCalculator rightTask = 47 new ForkJoinSumCalculator(numbers, start + length/2, end); 48 // 递归调用, 方面 多次拆分, 49 Long rightResult = rightTask.compute(); 50 Long leftResult = leftTask.join(); 51 return leftResult + rightResult; 52 } 53 54 private long computeSequentially() { 55 long sum = 0; 56 for (int i = start; i < end; i++) { 57 58 sum += numbers[i]; 59 } 60 return sum; 61 62 } 63 64 65 // 对外调用 接口 66 public static long forkJoinSum(long n) { 67 long[] numbers = LongStream.rangeClosed(1, n).toArray(); 68 ForkJoinTask<Long> task = new ForkJoinSumCalculator(numbers); 69 return new ForkJoinPool().invoke(task); 70 } 71 72 73 public long[] getNumbers() { 74 return numbers; 75 } 76 77 public int getStart() { 78 return start; 79 } 80 81 public int getEnd() { 82 return end; 83 } 84 85 public static long getTHRESHOLD() { 86 return THRESHOLD; 87 } 88 }
java ForkJoin 简单使用示例, 求和拆分为多个 线程执行,已提高效率
原文:https://www.cnblogs.com/sfchen/p/12887239.html