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

最新文章

  1. (2)WebAPI的增删改查
  2. 几个有用的jQuery代码片段
  3. Android系统版本与API Level对照表
  4. JS如何获取多个相同class标签并分别再输出各自的文本
  5. delphi 滚屏
  6. DTcms 扩展字段标签调用
  7. [HNOI 2013] 旅行 (数学)
  8. 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用
  9. NG2入门 - 根模块
  10. 顺企网 爬取16W数据保存到Mongodb
  11. SpringBoot(五):@ConfigurationProperties配置参数绑定
  12. 新特技软件(Analyzer)添加新用户
  13. python之Map函数
  14. Elsevier系旗下期刊论文投稿流程
  15. SANS社区帐号邮件激活问题
  16. Python Tkinter基础控件入门实例
  17. 【python】globle的使用
  18. 腾讯高性能RPC开发框架Tars实现服务治理(微服务)
  19. 关于Yii2.0的url路径优化问题(配置虚拟路径)
  20. java ssm框架入门(二)添加语言滤器

热门文章

  1. 一篇文章带你了解Java OOP思想
  2. STM32F103C8T6-CubeMx串口收发程序详细设计与测试(2)——程序规划、代码编写及测试
  3. Docker镜像仓库Harbor部署
  4. 多测师讲解接口测试 _fiddler无法打开浏览器_高级讲师肖sir
  5. docker查看ip
  6. scp远程上传
  7. echo 输出颜色
  8. Gitlab 11.9.1 高可用教程
  9. 因果推理综述——《A Survey on Causal Inference》一文的总结和梳理
  10. MySql中varchar(10)和varchar(100)的区别