Java Fork/Join 求和例子 0~10000000
原创 justdoit 发表于:2020-03-01 20:40:28
  阅读 :56   收藏   编辑
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();

    }
}