import java.math.BigDecimal; import java.time.Duration; import java.time.Instant; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; import java.util.concurrent.TimeUnit; import java.util.stream.LongStream; public class Test { class numSumTask extends RecursiveTask { private final int THRESHOLD = 10; private int start; private int end; private long[] list; public numSumTask(int start, int end, long[] data) { this.start = start; this.end = end; this.list = data; } @Override protected BigDecimal compute() { BigDecimal bg = BigDecimal.ZERO; /** * 数组长度如果小于等于10,使用for循环累计 */ if ((end - start) <= THRESHOLD) { for (int i = start; i < end; i++) { bg = bg.add(new BigDecimal(list[i])); } }else { int middle = (start + end) / 2; numSumTask sendTaskLeft = new numSumTask(start, middle, list); numSumTask sendTaskRight = new numSumTask(middle, end, list); //递归调用 invokeAll(sendTaskLeft, sendTaskRight); try { BigDecimal l = (BigDecimal)sendTaskLeft.get(); BigDecimal r = (BigDecimal)sendTaskRight.get(); bg = l.add(r); }catch (Exception e){ e.printStackTrace(); } } return bg; } } public static void main(String[] args) throws Exception{ long[] numbers = LongStream.rangeClosed(1, 10000000).toArray(); Instant start = Instant.now(); ForkJoinPool joinPool = new ForkJoinPool(); Future<BigDecimal> result = joinPool.submit(new Test().new numSumTask(0,numbers.length,numbers)); Instant end = Instant.now(); System.out.println("耗时:" + Duration.between(start, end).toMillis() + "ms"); System.out.println(result.get()); joinPool.awaitTermination(10, TimeUnit.SECONDS); joinPool.shutdown(); } }