首页 > 其他 > 详细

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

时间:2020-07-01 14:45:47      阅读:41      评论:0      收藏:0      [点我收藏+]

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

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

业务场景

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

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

如下图:
技术分享图片

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

第二版写法(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方法:结果如下
技术分享图片

执行forkjoin方法:结果如下
技术分享图片

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

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

原文:https://www.cnblogs.com/yeyongjian/p/13218943.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!