• ForkJoin和流式操作


    Fork/Join框架:在必要的情况下,将一个大任务,进行拆分(fork) 成若干个子任务(拆到不能再拆,这里就是指我们制定的拆分的临界值),再将一个个小任务的结果进行join汇总。

    采用juc包的fork/join框架

    public class ForkJoinWork extends RecursiveTask<Long> {
    
        private Long start;//起始值
        private Long end;//结束值
        public static final  Long critical = 100000L;//临界值
    
        public ForkJoinWork(Long start, Long end) {
            this.start = start;
            this.end = end;
        }
    
        @Override
        protected Long compute() {
            //判断是否是拆分完毕
            Long lenth = end - start;
            if(lenth<=critical){
                //如果拆分完毕就相加
                Long sum = 0L;
                for (Long i = start;i<=end;i++){
                    sum += i;
                }
                return sum;
            }else {
                //没有拆分完毕就开始拆分
                Long middle = (end + start)/2;//计算的两个值的中间值
                ForkJoinWork right = new ForkJoinWork(start,middle);
                right.fork();//拆分,并压入线程队列
                ForkJoinWork left = new ForkJoinWork(middle+1,end);
                left.fork();//拆分,并压入线程队列
    
                //合并
                return right.join() + left.join();
            }
        }
    }
    public class ForkJoinWorkTest {
    
        public static void main(String[] args) {
            test();
            test2();
            test3();
        }
    
        public static  void test() {
            //ForkJoin实现
            long l = System.currentTimeMillis();
            ForkJoinPool forkJoinPool = new ForkJoinPool();//实现ForkJoin 就必须有ForkJoinPool的支持
            ForkJoinTask<Long> task = new ForkJoinWork(0L,1000000000L);//参数为起始值与结束值
            Long invoke = forkJoinPool.invoke(task);
            long l1 = System.currentTimeMillis();
            System.out.println("ForkJoin实现  result  = " + invoke+"  time: " + (l1-l));
            //result = 500000000500000000  time:    7422
        }
    
        public static void test2(){
            //普通线程实现
            Long x = 0L;
            Long y = 1000000000L;
            long l = System.currentTimeMillis();
            for (Long i = 0L; i <= y; i++) {
                x+=i;
            }
            long l1 = System.currentTimeMillis();
            System.out.println("单线程  result = " + x+"  time: " + (l1-l));
            //result =  500000000500000000  time: 8274
        }
    
        public  static void test3(){
            //Java 8 并行流的实现
            long l = System.currentTimeMillis();
            long reduce = LongStream.rangeClosed(0, 1000000000L).parallel().reduce(0, Long::sum);
            long l1 = System.currentTimeMillis();
            System.out.println("Java8并行流 result  = " + reduce+"  time: " + (l1-l));
            //result = 500000000500000000  time:   855
        }
    
    }
  • 相关阅读:
    【VUE】vue + element 插槽实现表格某一列点击事件
    【CDH】CDH集群hiveserver2服务频繁挂掉
    【】火焰图安装使用
    【VUE】vue + elementui实现表格一个单元格中加多行数据
    【Mybatis】useGeneratedKeys参数用法及遇到的问题
    【springboot】SpringBoot配置logback.xml 多环境
    Java 代码中数字中间带下划线是几个意思
    Java 9 中的字符串(String)压缩的改进
    【抖机灵】JS小妙用
    wrapper.or and 语句写法
  • 原文地址:https://www.cnblogs.com/moris5013/p/11890797.html
Copyright © 2020-2023  润新知