zoukankan      html  css  js  c++  java
  • ForkJoin

    ForkJoin

    ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。
    大数据量! 大数据:Map Reduce (把大任务拆分为小任务)

    image-20200804094252341

    • ForkJoin 特点:工作窃取

      这个里面维护的都是双端队列

    image-20200804094755135

    ForkJoinPool

    image-20200804113300026

    image-20200804111006757

    /**
     * 求和计算的任务!
     * 3000   6000(ForkJoin)  9000(Stream并行流)
     * // 如何使用 forkjoin
     * // 1、forkjoinPool 通过它来执行
     * // 2、计算任务 forkjoinPool.execute(ForkJoinTask task)
     * // 3. 计算类要继承 ForkJoinTask
     */
    public class ForkJoinDemo extends RecursiveTask<Long> {
    
        private Long start;  // 1
        private Long end;    // 1990900000
    
        // 临界值
        private Long temp = 10000L;
    
        public ForkJoinDemo(Long start, Long end) {
            this.start = start;
            this.end = end;
        }
    
        // 计算方法
        @Override
        protected Long compute() {
            if ((end-start)<temp){
                Long sum = 0L;
                for (Long i = start; i <= end; i++) {
                    sum += i;
                }
                return sum;
            }else { // forkjoin 递归
                long middle = (start + end) / 2; // 中间值
                ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
                task1.fork(); // 拆分任务,把任务压入线程队列
                ForkJoinDemo task2 = new ForkJoinDemo(middle+1, end);
                task2.fork(); // 拆分任务,把任务压入线程队列
    
                return task1.join() + task2.join();
            }
        }
    }
    

    测试:

    public class Test {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
             test1(); // 6926
             test2(); // 4482
             test3(); // 174
        }
    
        // 普通程序员
        public static void test1(){
            Long sum = 0L;
            long start = System.currentTimeMillis();
            for (Long i = 1L; i <= 10_0000_0000; i++) {
                sum += i;
            }
            long end = System.currentTimeMillis();
            System.out.println("sum="+sum+" 时间:"+(end-start));
        }
    
        // 会使用ForkJoin
        public static void test2() throws ExecutionException, InterruptedException {
            long start = System.currentTimeMillis();
    
            ForkJoinPool forkJoinPool = new ForkJoinPool();
            ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);
            ForkJoinTask<Long> submit = forkJoinPool.submit(task);// 提交任务
            Long sum = submit.get();
    
            long end = System.currentTimeMillis();
    
            System.out.println("sum="+sum+" 时间:"+(end-start));
        }
    
        public static void test3(){
            long start = System.currentTimeMillis();
            // Stream并行流 ()  (]
            long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
            long end = System.currentTimeMillis();
            System.out.println("sum="+"时间:"+(end-start));
        }
    
    }
    

    视频参考https://www.bilibili.com/video/BV1B7411L7tE
    上一篇:Stream流式计算
    下一篇:异步回调

  • 相关阅读:
    遇见Javascript类型数组
    编译Android常用命令
    V4L2驱动视频开发要点
    Windows Phone开发(27):隔离存储A
    Ubuntu10.04下Android开发环境搭建
    V4L2开发要点
    使用 php Header 报错的一个原因
    Windows Phone开发(28):隔离存储B
    用HTML5 Audio API开发游戏音乐
    php备份数据库类分享
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443328.html
Copyright © 2011-2022 走看看