ForkJoin使用

Fork/Join 框架详解 Fork/Join 是一种并行计算模式,用于解决可以被分解成更小的可并行任务的问题。该模式包含两个关键操作:Fork(分解)和Join(合并)。在 Fork/Join 模式中,原始问题被递归地分解为更小的子问题,直到达到可以并行解决的最小单位。这个过程被称为 Fork。每个子问题可以独立地在不同的处理器上执行,并行地求解部分问题。一旦所有的子问题都被解决,就会进行 Join 操作。Join 操作将所有子问题的结果合并为最终的解决方案。 阅读详情
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:
  1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割
  2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
  在Java的Fork/Join框架中,使用两个类完成上述操作
  1.ForkJoinTask:我们要使用Fork/Join框架,首先需要创建一个ForkJoin任务。该类提供了在任务中执行fork和join的机制。通常情况下我们不需要直接集成ForkJoinTask类,只需要继承它的子类,Fork/Join框架提供了两个子类:
    a.RecursiveAction:用于没有返回结果的任务
    b.RecursiveTask:用于有返回结果的任务
  2.ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行
  任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务(工作窃取算法)。

参照链接地址:https://www.cnblogs.com/senlinyang/p/7885964.html

package com.company.demo1;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

/**
 * fork join学习
 *
 * 以下计算 1 + 2 + 3 + 4 + ... + n 的结果
 *
 * <p>
 * RecursiveTask 和 RecursiveAction 的区别就是前者有返回值,后者无返回值
 * <p>
 * 通过这个例子,进一步了解ForkJoinTask,ForkJoinTask与一般任务的主要区别在于它需要实现compute方法,
 * 在这个方法里,首先需要判断任务是否足够小,如果足够小就直接执行任务。
 * 如果不足够小,就必须分割成两个子任务,每个子任务在调用fork方法时,又会进入compute方法,
 * 看看当前子任务是否需要继续分割成子任务,如果不需要继续分割,则执行当前子任务并返回结果。
 * <p>
 * 使用join方法会等待子任务执行完并得到其结果。
 */
public class ForkJoinTest extends RecursiveTask<Integer> {

    private static final int THREAD_HOLD = 2;

    private int start;
    private int end;

    private ForkJoinTest(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {

        int sum = 0;

        //如果任务足够小就计算
        boolean canCompute = (end - start) <= THREAD_HOLD;
        if (canCompute) {
            for (int i = start; i <= end; i++) {
                sum += i;
            }

            //模拟耗时计算
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("任务足够小了,直接计算,计算结果:" + sum);
        } else {

            int middle = (start + end) / 2;

            System.out.println("任务还不够小,继续分割,middle:" + middle);

            ForkJoinTest left = new ForkJoinTest(start, middle);
            ForkJoinTest right = new ForkJoinTest(middle + 1, end);
            //执行子任务
            left.fork();
            right.fork();
            //获取子任务结果

            long startTime = System.currentTimeMillis();

            //join() 方法会阻塞到结果算出来
            int lResult = left.join();
            int rResult = right.join();

            System.out.println("当前线程:" + Thread.currentThread().getName() +"耗时:" + (System.currentTimeMillis() - startTime) + "ms");

            sum = lResult + rResult;
            System.out.println("计算结果 sum:" + sum);
        }
        return sum;
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinTest task = new ForkJoinTest(1, 100);
        Future<Integer> result = pool.submit(task);
        try {
            long start = System.currentTimeMillis();
            Integer sum = result.get();
            System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms,计算结果:" + sum);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}


ForkJoin框架使用和原理剖析 ForkJoin使用和原理剖析 相信大家此前或多或少有了解到ForkJoin,ForkJoin框架其实就是一个线程池ExecutorService的实现,通过工作窃取(work-stealing)算法,获取其他线程中未完成的任务来执行。可以充分利用机器的多处理器优势,利用空闲的线程去并行快速完成一个可拆分为小任务的大任务,类似于分治算法。ForkJoin的目标,就是使用所有可用的处理能力来提高程序... 阅读详情

相关推荐

ForkJoin框架简单使用

场景描述 设想这样一个场景,在一个接口中,需要通过http的方式调用多个外部接口,而且可能存在某几个接口非常耗时的情况,这么一来,对当前接口来说,由于是串行的执行,忽略本地接口的耗时,总的耗时就可以大致估算为调用的多个外部接口响应时间之和,这还是在没有考虑网络延时等其他外部因素作用下 这种场景在业务中随处可见,也是程序员考虑的优化接口响应时间的入手点 解决思路 当存在上述的情况,我们很自然的联想到...

congge 1万+

fork-join详解(1)

1.fork-join概括 fork-join使用的是一种分而治之的一种思想模式,大数据里面也用得很多这种思想比如常见的MapReduce编程模型,分而治之就是把一个很大的任务拆分成很多个小任务并且小任务之间毫无关联,这个就是分而治之,与之相关的还有一个动态规划,动态规划也是拆分很多个小任务,但是与分而治之不同的是他的小任务之间有依赖关联,听了这些小伙伴们应该了解fork-join框架是个什么了吧,fork-join本质上来说就是一个递归,把一个大任务利用递归拆分成很多小任务,任务处理完毕,在使用递归一级

qfzhaohan的博客 1554

【Java 并发编程】ForkJoin 框架使用代码实例

在文章 JUC并行计算框架 Fork/Join 原理图文详解&代码示例 中,我们详细介绍了 ForkJoin 框架 的原理,这里我们再给出一个代码实例: package i.juc; import java.util.Arrays; import java.util.List; /** * @author: Jack * 2020-06-03 10:20 */ public cl...

AI天才研究院 9399

ForkJoin详解

Fork/Join 是一个分而治之的任务框架,如一个任务需要多线程执行,分割成很多块计算的时候,可以采用这种方法。 动态规范:和分而治之不同的是,每个小任务之间互相联系。 工作密取:分而治之分割了每个任务之后,某个线程提前完成了任务,就会去其他线程偷取任务来完成,加快执行效率。同时,第一个分配的线程是从队列中的头部拿任务,当完成任务的线程去其他队列拿任务的时候是从尾部拿任务,所以这样就避免了竞争。 在Java的Fork/Join框架中,使用两个类完成上述操作:   1.ForkJoinTask:我们要使用F

baihaiyang99的博客 1万+

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1423

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7365

Fork / Join 框架的基本使用

Fork / Join框架1.概述2. Fork / Join 框架的基本使用2.1 执行流程图2.2 ForkJoinPool构造函数2.3 ForkJoinTask 类型2.4 fork() 和 join() 方法3. 工作窃取模式 Fork / Join框架 1.概述 ForkJoin 是由JDK1.7后提供多线并发处理框架,ForkJoin 的框架的基本思想是将一个复杂的计算进行某种规则的拆分。使用 ForkJoin 将相同的计算任务通过多线程的进行执行。从而能提高数据的计算速度。 2. Fork.

雨后是冰雹 572

一文吃透 BMS:动力电池与储能共用的电池管控全架构详解

BMS作为电池系统的核心控制器,其技术深度和系统复杂性不容小觑。动力电池与储能系统虽然应用场景不同,但在核心架构上共享大量基础技术。成功的BMS设计需要在精度、可靠性、成本、功耗之间找到最佳平衡点。未来,随着电池技术的进步和智能化需求的提升,BMS将向着更高集成度、更强智能化、更优经济性的方向发展。无论是汽车工程师还是储能系统设计师,深入理解BMS的全栈架构,掌握其核心技术原理,都将是应对未来能源存储挑战的关键能力。核心要点回顾BMS采用分层分布式架构,硬件是基础,算法是灵魂。

小帽子的博客 337

ForkJoin全解3:CountedCompleter

1、使用示例 import java.util.concurrent.CountedCompleter; import java.util.concurrent.atomic.AtomicInteger; public class CountedCompleterDemo { interface Applier<E>{ void apply(E e); } static class ForEach<E> extends CountedCo

yu766588220的专栏 836

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 973

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

在angular中使用forkjoin

forkjoin的使用 为什么要使用forjoin? 个人理解:有的时候我们需要多个接口返回值之后才能加载数据渲染页面,此时可以使用forkjoin component.ts import { forkJoin } from 'rxjs'; forkJoin( this._apiService.getIndexCode('PatientTotal'), this._apiService.getI...

qq_36487294的博客 2879

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。

专注生信领域 2017

ForkJoin的使用

可以先简单了解下【JDK中的ForkJoin机制】。 1、使用ForkJoin来实现数组中元素排序,使用invoke方法和submit方法。 package com.su.mybatis.oracle.controller; import java.util.Arrays; import java.util.Random; //import java.util.concurrent.Exe...

suchenbin的博客 286

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.youkuaiyun.com/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8795

【PG高可用】一 PostgreSQL高可用方案repmgr部署(非常详细)

repmgr安装部署

DBA之路的博客 7052

ForkJoin的使用案例

  使用ForkJoin计算1-100的和: public class ForkJoinTaskExample extends RecursiveTask&lt;Integer&gt; { public static final int threshold = 2; private int start; private int end; public Fo...

dwhhome的博客 906

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ForkJoin框架从入门到使用

因为本章很多是笔者参考自中文版API,先附上链接 https://ifeve.com/tag/forkjoin/ ForkJoin: 体现了分而治之的思想,大于既定大小,分为很多子任务,小于既定大小,直接调用任务解决 (自己判断情形),子任务是相对独立的,与原问题形式相同,将子问题的解合并得到原问题的解(有点类似mapReduce) fork操作:当你把任务分成更小的任务和使用这个框架执行它们。...

qq_41700030的博客 224

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于Java ForkJoin框架的使用demo

package com.com.test; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; import java.util.stream.LongStream; /** * TODO: 类描述 * * @author minghui */ public class...

m200674067的博客 441

Java里面ForkJoin框架和使用示例

ForkJoin 框架是 Java 7 引入的一个并行计算框架,主要用于将一个大任务拆分成多个小任务并行执行,最后将结果合并。它基于。

xuweilin的博客 572

并发编程之ForkJoin使用及原理

以forkJoin的一个使用情景开始吧 public class ForkJoinQuery extends RecursiveTask<Boolean> { private static final int THREAD_HOLD = 5000; private long start; private long end;//需要查询的所有数据的数量 private...

CoffeeAndMilk123的博客 564

ForkJoin从原理设计到使用图解

从JDK1.7开始,Java提供ForkJoin框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果。

meser88的博客 383

ForkJoin框架基本使用

ForkJoin框架

webrx的博客 1814

Angular 中 如何使用RxJS库中的forkJoin?

请注意,如果其中一个 Observable 发生错误,forkJoin 操作符会立即将错误传递给订阅者,并不会等待其他 Observable 完成。当所有 Observable 都完成时,forkJoin 才会发出一个值,这个值是一个数组,包含了所有 Observable 的最后一个发出的值。在 Angular 中,forkJoin 是 RxJS 库中的一个操作符,可以将多个 Observable 组合成一个 Observable,等到所有的 Observable 都完成时,才会发出一个值并结束。

金木AI 729
上一篇: 使用CompletableFuture构建异步应用(2)
下一篇: 如何用IDEA搭建Springboot spring MVC Mybatis集成环境
lichuangcsdn
博客等级 码龄12年 161粉丝 108原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值