实用fork/join框架提升程序效率
实用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框架提升程序效率的更多相关文章
- Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)
作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...
- java Fork/Join框架
应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...
- Fork/Join框架与Java8 Stream API 之并行流的速度比较
Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...
- Java 7 Fork/Join 框架
在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项.JSR166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection ...
- Fork/Join框架
java 5开始引入了Executor和ExecutorService接口以及实现这两个接口的类之后,使得java在并发支持上得到了进一步的提升.执行器框架(Executor Framework)将任 ...
- Fork/Join 框架框架使用
1.介绍 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.在多核计算机中正确使用可以很好的 ...
- 013-多线程-基础-Fork/Join框架、parallelStream讲解
一.概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 它同ThreadPoolExecut ...
- Java 并发之 Fork/Join 框架
什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名 ...
- JAVA中的Fork/Join框架
看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...
随机推荐
- python双向链表的实现
python双向链表和单链表类似,只不过是增加了一个指向前面一个元素的指针,下面的代码实例了python双向链表的方法 示意图: python双向链表实现代码: # -*- coding: utf-8 ...
- OpenCV图像加载与保存
OpenCV中的图像加载与保存 头文件是包含的库,在GitHub上下载的 imread("图片路径",图片加载方式) 图片加载方式: IMREAD_GRAYSCALE 灰度图像 I ...
- 浅谈Python常用英文单词
一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...
- MeteoInfo脚本示例:读取FY3A AOD HDF文件
FY3A卫星有AOD产品数据,HDF格式,这里示例用MeteoInfo脚本程序读取和显示该类数据. 脚本程序如下: #----------------------------------------- ...
- day25 Pyhton学习 MD5加密.日志
一.MD5加密 MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作 import ha ...
- cmake引入三方库
目录结构 . |-- cmake | |-- CompilerSettings.cmake | |-- Options.cmake | `-- ProjectJsonCpp.cmake |-- CMa ...
- Linux操作系统的基本介绍
01 操作系统的概述介绍 操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控制输入设备与输出 ...
- rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间
上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...
- .Net Core单元测试规范
.Net Core单元测试规范 一. 前言 为了有效提升代码质量,保证DevOps的顺利进行.将全面开始采用单元测试进行覆盖,届时单元测试将完全纳入 到完整的持续构建生命周期中做为第一道质量把控的门槛 ...
- flink 处理实时数据的三重保障
flink 处理实时数据的三重保障 window+watermark 来处理乱序数据对于 TumblingEventTimeWindows window 的元数据startTime,endTime 和 ...