实用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接口的一个实现,可以帮助开发人员充分利用多核 ...
随机推荐
- 日志分析平台ELK之前端展示kibana
之前的博客一直在聊ELK集群中的存储.日志收集相关的组件的配置,但通常我们给用户使用不应该是一个黑黑的shell界面,通过接口去查询搜索:今天我们来了ELK中的前端可视化组件kibana:kibana ...
- 使用Ajax新闻系统管理需求分析
新闻系统管理需求分析 1.1项目背景 新闻发布系统(News Release System or Content Management System),是一个基于新闻和内容管理的全站管理系统,本系 ...
- visual studio 2015 Opencv4.0.1配置
最近由于工作需要,要配置opencv,我的电脑vs的version是2015,在网上下载了最新的opencv 4.0.1 自己摸索总是很困难,网上的例子也比较多,但版本比较低,也不确定适不适合vs20 ...
- idea 2020.1 Mybatis log plugin破解插件
下载 链接: https://pan.baidu.com/s/1FTgtJiyzxxaNxWLyX4OgZw 密码: w7w8 idea安装本地插件
- idea报“Cannot resolve symbol XXX”错误
解决方案
- 安装 Windows 10 系统时分区选择 MBR 还是 GUID?
一.MBR 和 GUID 的概述 MBR 分区表 MBR:Master Boot Record,即硬盘主引导记录分区表,指支持容量在2.1TB以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只 ...
- php上传图片,网站代码
1.php代码 2.表设置结构 3.jquery代码 4.显示网站的数据 6.上传图片 7.上传图片的php代码
- vue的二级联动,数据是从php获取到的
1.首先,一级要有change改变事件的关键字,v-on:change="selectarr($event)" 这是created(){}函数里面的自动调用一级分类的数据 html ...
- Fedora version history --- kernel version
Fedora version history https://en.wikipedia.org/wiki/Fedora_version_history Version (Code name)[ ...
- 晋城6397.7539(薇)xiaojie:晋城哪里有xiaomei
晋城哪里有小姐服务大保健[微信:6397.7539倩儿小妹[晋城叫小姐服务√o服务微信:6397.7539倩儿小妹[晋城叫小姐服务][十微信:6397.7539倩儿小妹][晋城叫小姐包夜服务][十微信 ...