实用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框架提升程序效率的更多相关文章

  1. Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)

    作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...

  2. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  3. Fork/Join框架与Java8 Stream API 之并行流的速度比较

    Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...

  4. Java 7 Fork/Join 框架

    在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项.JSR166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection ...

  5. Fork/Join框架

    java 5开始引入了Executor和ExecutorService接口以及实现这两个接口的类之后,使得java在并发支持上得到了进一步的提升.执行器框架(Executor Framework)将任 ...

  6. Fork/Join 框架框架使用

    1.介绍 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.在多核计算机中正确使用可以很好的 ...

  7. 013-多线程-基础-Fork/Join框架、parallelStream讲解

    一.概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 它同ThreadPoolExecut ...

  8. Java 并发之 Fork/Join 框架

    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名 ...

  9. JAVA中的Fork/Join框架

    看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...

随机推荐

  1. 日志分析平台ELK之前端展示kibana

    之前的博客一直在聊ELK集群中的存储.日志收集相关的组件的配置,但通常我们给用户使用不应该是一个黑黑的shell界面,通过接口去查询搜索:今天我们来了ELK中的前端可视化组件kibana:kibana ...

  2. 使用Ajax新闻系统管理需求分析

      新闻系统管理需求分析 1.1项目背景 新闻发布系统(News Release System or Content Management System),是一个基于新闻和内容管理的全站管理系统,本系 ...

  3. visual studio 2015 Opencv4.0.1配置

    最近由于工作需要,要配置opencv,我的电脑vs的version是2015,在网上下载了最新的opencv 4.0.1 自己摸索总是很困难,网上的例子也比较多,但版本比较低,也不确定适不适合vs20 ...

  4. idea 2020.1 Mybatis log plugin破解插件

    下载 链接: https://pan.baidu.com/s/1FTgtJiyzxxaNxWLyX4OgZw 密码: w7w8 idea安装本地插件

  5. idea报“Cannot resolve symbol XXX”错误

    解决方案

  6. 安装 Windows 10 系统时分区选择 MBR 还是 GUID?

    一.MBR 和 GUID 的概述 MBR 分区表 MBR:Master Boot Record,即硬盘主引导记录分区表,指支持容量在2.1TB以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只 ...

  7. php上传图片,网站代码

    1.php代码 2.表设置结构 3.jquery代码 4.显示网站的数据 6.上传图片 7.上传图片的php代码

  8. vue的二级联动,数据是从php获取到的

    1.首先,一级要有change改变事件的关键字,v-on:change="selectarr($event)" 这是created(){}函数里面的自动调用一级分类的数据 html ...

  9. Fedora version history --- kernel version

    Fedora version history https://en.wikipedia.org/wiki/Fedora_version_history     Version (Code name)[ ...

  10. 晋城6397.7539(薇)xiaojie:晋城哪里有xiaomei

    晋城哪里有小姐服务大保健[微信:6397.7539倩儿小妹[晋城叫小姐服务√o服务微信:6397.7539倩儿小妹[晋城叫小姐服务][十微信:6397.7539倩儿小妹][晋城叫小姐包夜服务][十微信 ...