日常记录——多线程与高并发—ForkJoinPool简介、代码示例

一、ForkJoinPool简介

ForkJoinPool:以拆分合并为核心的线程池,执行ForkJoinTask类型任务,两个类继承RecursiveAction(无返回值递归),RecursiveTask(有返回值递归)。ForkJoinPool中每个工作线程自己维护一个任务队列,当自己任务队列任务执行完,会从其他工作线程的任务队列取任务执行。ForkJoinPool是ExecutorService的扩展,更适合的是计算量大的任务。

二、代码示例

分别用迭代和ForkJoinPool 累加1-100000000的和:

public class ForkJoinPoolTest {

    public static void main(String[] args) {
        //1-10000000的数组
        long[] num = LongStream.rangeClosed(1,100000000L).toArray();
        long start = System.currentTimeMillis();
        long sum = 0;
        for (int i = 0; i < num.length; i++) {
            sum += num[i];
        }
        System.out.println(sum + "耗时:" + (System.currentTimeMillis()-start));
        long startfork= System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        Sumtask sumtask = new Sumtask(1,100000000L);
        forkJoinPool.execute(sumtask);
        System.out.println(sumtask.join() + "耗时:" + (System.currentTimeMillis()-startfork));
    }
    //RecursiveTask<V> 继承了 ForkJoinTask<V>
    static class Sumtask extends RecursiveTask<Long>{
        long start;
        long end;
        Sumtask(long start,long end){
           this.start = start;
           this.end = end;
        }
        //实现RecursiveTask的执行约定
        @Override
        protected Long compute() {
            //小于直接计算
            if(end -start <10000000){
                long sum = 0;
                for (long i = start; i <= end; i++) {
                    sum += i;
                }
                return sum;
            }else{
                //大于1000 递归拆分任务
                long middle = (start+end)/2;
                Sumtask leftSum = new Sumtask(start,middle);
                Sumtask rightSum = new Sumtask(middle+1,end);
                //提交任务
                leftSum.fork();
                rightSum.fork();
                return leftSum.join() + rightSum.join();
            }
        }
    }

执行结果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43001336/article/details/107397456