实用fork/join框架提升程序效率
2024-09-05 10:15:38
实用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
最新文章
- (2)WebAPI的增删改查
- 几个有用的jQuery代码片段
- Android系统版本与API Level对照表
- JS如何获取多个相同class标签并分别再输出各自的文本
- delphi 滚屏
- DTcms 扩展字段标签调用
- [HNOI 2013] 旅行 (数学)
- 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用
- NG2入门 - 根模块
- 顺企网 爬取16W数据保存到Mongodb
- SpringBoot(五):@ConfigurationProperties配置参数绑定
- 新特技软件(Analyzer)添加新用户
- python之Map函数
- Elsevier系旗下期刊论文投稿流程
- SANS社区帐号邮件激活问题
- Python Tkinter基础控件入门实例
- 【python】globle的使用
- 腾讯高性能RPC开发框架Tars实现服务治理(微服务)
- 关于Yii2.0的url路径优化问题(配置虚拟路径)
- java ssm框架入门(二)添加语言滤器
热门文章
- 一篇文章带你了解Java OOP思想
- STM32F103C8T6-CubeMx串口收发程序详细设计与测试(2)——程序规划、代码编写及测试
- Docker镜像仓库Harbor部署
- 多测师讲解接口测试 _fiddler无法打开浏览器_高级讲师肖sir
- docker查看ip
- scp远程上传
- echo 输出颜色
- Gitlab 11.9.1 高可用教程
- 因果推理综述——《A Survey on Causal Inference》一文的总结和梳理
- MySql中varchar(10)和varchar(100)的区别