ForkJoinPool使用

1.简介

ForkJoinPool主要采用分治算法,将一个大任务分红一个个小任务,而后将小任务的结果汇总,获得大任务的结果,下面的demo就是计算1到1000000的总和,经过计算0->4,5->9,10->14...等等,每组的值,而后累加获得总和。java

2.ForkJoinPool使用demo

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

@Slf4j
public class ForkJoinPoolTest {

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        //当构造函数中没有传入要建立的线程数目时候,ForkJoinPool默认建立的线程数目为物理cpu数目
        int size = 1000000;

        long forkJoinStartTime = System.currentTimeMillis();
        long[] numbers = LongStream.rangeClosed(1, size).toArray();
        Long result = forkJoinPool.invoke(new MyRecursiveTask(numbers, 0, size-1)); //建立总任务,并调用
        long forkJoinEndTime = System.currentTimeMillis();
        System.out.println("running time:" + (forkJoinEndTime - forkJoinStartTime));
        System.out.println("result:"+result);
        forkJoinPool.shutdown();//关闭forkJoinPool池
    }

    private static class MyRecursiveTask extends RecursiveTask<Long> { //RecursiveTask 带返回值,RecursiveAction不带返回值

        private long[] numbers;
        private int start;
        private int end;

        public MyRecursiveTask(long[] numbers, int start, int end) {
            this.numbers = numbers;
            this.start = start;
            this.end = end;
        }

        @Override
        protected Long compute() {
            if (start - end <= 5) {//当起始数量小于等于5时候进行求和
                Long total = 0L;
                for (int i = start; i <= end; i++) {
                    total += numbers[i];
                }
                return total;
            } else {
                int middle = (start + end) / 2;
                MyRecursiveTask left = new MyRecursiveTask(numbers, start, middle); //分别建立两个子任务,也可根据须要建立多个子任务
                MyRecursiveTask right = new MyRecursiveTask(numbers, middle + 1, end);
                MyRecursiveTask.invokeAll(left,right);
                return left.join() + right.join(); //累加子任务的结果
            }
        }
    }
}

3.ForkJoinPool实战

业务中常常到了节假日或者活动日,都须要向全部用户的号码发送短信,面对庞大的用户量,若是仍是顺序执行发送短信,将会很是耗时,能够使用ExecutorService线程池并发作,也能够使用ForkJoinPool作。算法

相关文章
相关标签/搜索