欢迎大家关注我公众号“从零开始的it转行生”

实用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

posted @ 2020-07-01 14:05  大佬健  阅读(277)  评论(0编辑  收藏  举报

欢迎大家关注我公众号“从零开始的it转行生”