一千万个数,高效求和
1 private class SumTask extends RecursiveTask<Long> { 2 3 private static final int THRESHOLD = 1250000; 4 5 private long arr[]; 6 private int start; 7 private int end; 8 9 public SumTask(long[] arr, int start, int end) { 10 this.arr = arr; 11 this.start = start; 12 this.end = end; 13 } 14 15 /** 16 * 小计 17 */ 18 private long subtotal() { 19 long sum = 0; 20 for (int i = start; i < end; i++) { 21 sum += arr[i]; 22 } 23 24 return sum; 25 } 26 27 @Override 28 protected Long compute() { 29 30 if ((end - start) <= THRESHOLD) { 31 return subtotal(); 32 }else { 33 int middle = (start + end) / 2; 34 SumTask left = new SumTask(arr, start, middle); 35 SumTask right = new SumTask(arr, middle, end); 36 left.fork(); 37 right.fork(); 38 39 return left.join() + right.join(); 40 } 41 } 42 } 43 44 public static void main(String[] args) throws ExecutionException, InterruptedException{ 45 int num = Runtime.getRuntime().availableProcessors(); 46 long time = System.currentTimeMillis(); 47 long[] arr = new long[10000000]; 48 for (int i =0 ; i < 10000000; i++) { 49 arr[i] =i+1; 50 } 51 52 ForkJoinPool pool = new ForkJoinPool(); 53 ForkJoinTask<Long> result = pool.submit(new ForkJoinTest().new SumTask(arr, 0, arr.length)); 54 System.out.println("最终计算结果: " + result.invoke()+"耗时:"+(System.currentTimeMillis() - time)+",毫秒"); 55 pool.shutdown(); 56 }