zoukankan      html  css  js  c++  java
  • 实用fork/join框架提升程序效率

    实用fork/join框架提成程序效率

    原文地址:https://www.jianshu.com/p/9ce243796d4a

    业务场景

    最近再做一个接口,我是一个中央的消息接受方,当我接受到消息后要分发消息到其他系统,带其他系统返回结果后,要把结果打包返回给调用方。流程图入下:
    调用流程图

    第一版的写法(常规串行写法)

    如下图:
    串行写法

    这钟写法有个缺点,就是要A系统返回结果后,才调用B系统。而实际业务场景,根本不用等A就能直接调用B的了。
    而且整个接口的执行时间是系统A+系统B的时间。随着后面对接的系统越来越来,接口大概率是会超时。
    (这里不是能发布订阅模式,因为调用方要知道每个系统的返回结果,要全部系统完成后,我的接口才能返回成功/失败)

    第二版写法(forkjoin写法)

    流程图如下:
    forkjoin写法
    这种写法的优点是不用等系统A返回结果也能执行系统B的流程。接口总用时是MAX(系统A,系统B),不会随着对接的系统增加而大幅增加调用时间。
    这个写法有个限制条件,就是系统A的调用结果不影响系统B。

    最后贴上代码:
    MyRecursiveTask类

    public class MyRecursiveTask extends RecursiveTask {
    
        private Integer sleepTIme;
        public MyRecursiveTask(Integer sleepTIme) {
            this.sleepTIme = sleepTIme;
        }
    
        @Override
        protected Object compute() {
    
            System.out.println("doing:"+sleepTIme+";begin,now ="+ LocalTime.now());
            try {
                Thread.sleep(sleepTIme);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("doing:"+sleepTIme+";end,now ="+LocalTime.now());
            return sleepTIme;
        }
    }
    

    Main类

    public class Main {
    
        public static void main(String[] args) throws Exception {
            normal();
    //        forkJoin();
    
        }
    
        private static void normal() {
            long begin = System.currentTimeMillis();
            MyRecursiveTask myRecursiveTask1 = new MyRecursiveTask(1000);
            MyRecursiveTask myRecursiveTask2 = new MyRecursiveTask(2000);
    
    
            Object o1 = myRecursiveTask1.compute();
            Object o2 = myRecursiveTask2.compute();
            System.out.println("o1="+o1);
            System.out.println("o2="+o2);
            long end = System.currentTimeMillis();
            System.out.println("normal总用时:"+(end-begin));
        }
    
        private static void forkJoin() throws Exception{
            long begin = System.currentTimeMillis();
            MyRecursiveTask myRecursiveTask1 = new MyRecursiveTask(1000);
            MyRecursiveTask myRecursiveTask2 = new MyRecursiveTask(2000);
            myRecursiveTask1.fork();
            myRecursiveTask2.fork();
    
    
            Object o1 = myRecursiveTask1.get();
            Object o2 = myRecursiveTask2.get();
            System.out.println("o1="+o1);
            System.out.println("o2="+o2);
            long end = System.currentTimeMillis();
            System.out.println("forkJoin总用时:"+(end-begin));
        }
    }
    

    执行normal方法:结果如下
    nromal

    执行forkjoin方法:结果如下
    forjoin

    github地址:https://github.com/hd-eujian/forkjoin.git
    码云地址:https://gitee.com/guoeryyj/forkjoin.git

  • 相关阅读:
    第二阶段冲刺第九天
    第二阶段冲刺第八天
    第二阶段冲刺第七天
    第二阶段冲刺第六天
    第二阶段冲刺第五天
    第二阶段冲刺第四天
    第二阶段冲刺第三天
    java-小组项目-需求视频
    绩效评估方法
    各组对我们的意见汇总
  • 原文地址:https://www.cnblogs.com/yeyongjian/p/13218943.html
Copyright © 2011-2022 走看看