首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏全栈程序员必看

    ForkJoin之RecursiveAction和RecursiveTask的简单使用

    ForkJoin之RecursiveAction和RecursiveTask的简单使用 Java提供的多线程可以提高CPU的利用率,现在的CPU都是多核多线程,如果不好好利用,只运行单线程程序,会使得CPU 简单示例 ForkJoinTask下有两个常用的类:RecursiveAction和RecursiveTask。 RecursiveAction不支持返回值,RecursiveTask支持返回值。 src/exporter/file/zip /Users/panchanghe/temp/ext-6.6.0/build/packages/exporter/src/exporter/file/zip RecursiveTask ArrayTask public class ArrayTask extends RecursiveTask<Integer> { //单个任务处理的阈值 private final static

    37720编辑于 2022-09-29
  • 来自专栏allsmallpi博客

    RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流

    ForkJoinTask是一个抽象类,它有两个抽象子类:RecursiveAction和RecursiveTaskRecursiveTask代表有返回值的任务 RecursiveAction代表没有返回值的任务。 RecursiveTask 下面以一个有返回值的大任务为例,介绍一下RecursiveTask的用法。 大任务是:计算随机的1000个数字的和。 小任务是:每次只能70个数值的和。 package com.example.jedis.test; import java.util.concurrent.RecursiveTask; /**  *  * @Author : Wukn  * @Date : 2018/2/5  */ public class RecursiveTaskDemo extends RecursiveTask {     /**      *  每个

    1.8K20发布于 2021-02-25
  • 来自专栏JUC

    【JUC基础】16. Fork Join

    来看下执行结果: 从代码中,还有几个和平时使用不一样的地方: CountTask继承了RecursiveTask main中线程池使用了ForkJoinPool 3.2、RecursiveTask Recursive 翻译过来就是递归,RecursiveTask也就是递归任务。 泛型类型:RecursiveTask是一个泛型类,通过类型参数V表示任务执行的结果类型。 任务拆分:RecursiveTask通常用于需要将大任务划分为小任务并以递归的方式执行的场景。 3.3、RecursiveAction 而RecursiveAction与RecursiveTask相似,RecursiveTask是带有返回值类型;而RecursiveAction是不带有返回值的任务

    30410编辑于 2024-01-25
  • 来自专栏IT架构圈

    Java8--新特性--串并行流与ForkJoin框架

    将代码包装在ForkJoinTask子类中,通常是RecursiveTask(可以返回结果) 或 RecursiveAction。 java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask ForkJoinPool forkJoinPool = new ForkJoinPool(); RecursiveTask<String> recursiveTask = new RecursiveTask ); ForkJoinTask<String> submitx = forkJoinPool.submit(recursiveTask); System.out.println (submit.get()); recursiveTask.join(); } } PS:工作窃取带来的性能提升偏理论,API的复杂性较高,实际研发中可控性来说不如其他API

    74320发布于 2020-11-09
  • 来自专栏javathings

    ForkJoinPool 是什么?

    提交到 ForkJoinPool 的任务,必须是 RecursiveTask 或者 RecursiveAction 的子类,它们都是一个抽象类,且继承与 ForkJoinTask。 类中 compute() 方法是执行 RecursiveTask 的主要方法。区别在于:RecursiveTask 代表有返回值的任务,RecursiveAction 代表没有返回值的任务。 result = fjpool.submit(fjt); System.out.println(result.get()); } } class Fibonacci extends RecursiveTask f1.fork(); f2.fork(); return f1.join() + f2.join(); } } 代码说明: Fibonacci 类是 RecursiveTask

    1.8K30发布于 2018-11-13
  • 来自专栏彭湖湾的编程世界

    【Java】Fork-join框架学习笔记

    最主要的类有两个: ForkJoinTask类和ForkJoinPool,前者的实例要由后者的实例提交运行 如下图所示: image.png image.png 一: ForkJoinTask类: 有两个子类:RecursiveTask 类和RecursiveAction类 1.ForkJoinTask是能在ForkJoinPool中运行的类的抽象父类,一般不会直接使用它,而是使用继承自它的两个子类:RecursiveTask类和RecursiveAction 但是相较之下更加轻量,最外层的ForkJoinTask和它内部的子ForkJoinTask只需要ForkJoinPool中的少量线程就可以顺利执行(这和ForkJoinPool的工作窃取机制有关,下面将讲述) 4.RecursiveTask RecursiveAction类不能返回计算结果, 它们都要求重写compute方法,如有返回结果则在compute方法中返回,见下面示例: public class ForkJoinDemo extends RecursiveTask ; public class ForkJoinDemo extends RecursiveTask { private static int minNum = 5; private int

    74530编辑于 2022-03-24
  • 来自专栏全栈程序员必看

    fork join语句_java forkjoinpool

    二、3大类 2.1 ForkJoinPool 分支合并池 类比=> 线程池 2.2 ForkJoinTask ForkJoinTask 类比=> FutureTask 2.3 RecursiveTask java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask ; class MyTask extends RecursiveTask<Integer>{ private static final Integer ADJUST_VALUE = 10; join(); } return result; } } /** * 分支合并例子 * ForkJoinPool * ForkJoinTask * RecursiveTask

    48920编辑于 2022-11-05
  • 来自专栏行者悟空

    我眼中的并发编程——Fork/Join模型

    通常做法是继承 RecursiveTask或 RecursiveAction。 RecursiveTask:有返回值。 RecursiveAction:无返回值。 java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask ; public class CountTask extends RecursiveTask<Long> { private static final long serialVersionUID 

    1.1K50发布于 2018-06-22
  • 来自专栏Web 技术

    ForkJoinPool 你真的明白和用对了吗

    RecursiveTask: 这个类的工作方式类似于 RecursiveAction,不同之处在于 compute() 方法将返回一个值。 RecursiveTask 在这个示例中,我们使用 RecursiveTask 类看看有没有什么区别。 RecursiveAction 和 RecursiveTask 之间的区别在于,使用 RecursiveTask,我们可以在compute() 方法中返回一个值。 ; public class ForkJoinSumArrayTask extends RecursiveTask<Integer> { private final List<Integer> RecursiveTask 用于计算递归操作,但返回一个值。 compute() 方法在两个类中被重写以实现自定义逻辑。 fork() 方法调用 compute() 方法并将任务分解为更小的子任务。

    1.7K10编辑于 2023-10-07
  • 来自专栏FunTester

    ForkJoinPool实践

    然后我们要创建一个任务类实现任务分配规则,首先继承java.util.concurrent.RecursiveTask实现java.util.concurrent.RecursiveTask#compute import groovy.util.logging.Log4j2 import java.util.concurrent.ForkJoinPool import java.util.concurrent.RecursiveTask @Log4j2 class ForkJoinT extends RecursiveTask<Integer> { static def data = 1..100 as List int k) { SourceCode.range(i, k + 1).map(data::get).sum() } } 总体感觉java.util.concurrent.RecursiveTask

    42730编辑于 2023-08-04
  • 来自专栏全栈程序员必看

    成果被他人窃取_工作窃取模式

    ForkJoinPool,通过ForkJoinPool来执行 2.计算任务forkJoinPool.execute(ForkJoinTask task) 3.计算类要继承ForkJoinTask(执行任务RecursiveTask :有返回值 RecursiveAction:无返回值) Class ForkJoinPool有一个异步执行任务的方法 我们需要用到有返回值的RecursiveTask 使用RecursiveTask 需要继承RecursiveTask,并定义返回值类型 class Fibonacci extends RecursiveTask<Integer> ForkJoin求和计算Demo import java.util.concurrent ForkJoinPool,通过ForkJoinPool来执行 * 2.计算任务forkJoinPool.execute(ForkJoinTask task) * 3.计算类要继承ForkJoinTask(执行任务RecursiveTask :有返回值 RecursiveAction:无返回值) */ class MySumForkJoin extends RecursiveTask<Long> { private Long start

    53730编辑于 2022-09-30
  • 来自专栏小赵的Java学习

    一个对任务分而治之的java类ForkJoin详解

    他主要有两个子类:RecursiveAction和RecursiveTask。然后通过fork()方法去分配任务执行任务,通过join()方法汇总任务结果, 这就是整个过程的运用。 (1)RecursiveAction 一个递归无结果的ForkJoinTask(没有返回值) (2)RecursiveTask 一个递归有结果的ForkJoinTask(有返回值) ForkJoinPool 二、使用 1、RecursiveTask :有返回结果 (1)第一步:创建MyRecursiveTask子类在ForkJoinTest中 在这个方法中我们传进去数据,然后使用二分法继续分配给子任务 过程和之前的RecursiveTask类似。 (2)第二步在ForkJoinTest中去测试 现在不管我们输出多少次都可以有返回结果了。

    58130编辑于 2022-12-02
  • 来自专栏JAVA核心

    深入理解Java中的ForkJoin框架原理

    ForkJoinTask有两个重要的子类:RecursiveAction和RecursiveTask。 RecursiveAction用于执行没有返回值的任务,而RecursiveTask用于执行有返回值的任务。这两个子类都需要实现一个compute()方法来定义任务的逻辑。 任务划分(Fork) 开发者需要定义一个ForkJoinTask(通常是RecursiveAction或RecursiveTask的子类),并实现其compute方法。 对于有返回值的任务(RecursiveTask),任务完成时需要返回其结果。 其他任务可以使用join方法等待一个子任务完成,并获取其结果(仅适用于RecursiveTask)。 ; // 继承 RecursiveTask,实现一个计算数组中元素和的任务 public class SumArrayTask extends RecursiveTask<Integer>

    94310编辑于 2024-03-21
  • 来自专栏小工匠聊架构

    Java8 - 一文搞定Fork/Join 框架

    我们可以通过继承来实现一个RecursiveAction RecursiveTask :用于有返回结果的任务。 可以将自己的工作分割为若干更小任务,并将这些子任务的执行合并到一个集体结果。 ---- RecursiveTask 实现 并行计算 要把任务提交到这个池,必须创建 RecursiveTask 的一个子类,其中 R 是并行化任务(以及所有子任务)产生的结果类型,或者如果任务不返回结果 要定义 RecursiveTask, 只需实现它唯一的抽象方法compute protected abstract R compute(); 这个方法同时定义了将任务拆分成子任务的逻辑,以及无法再拆分或不方便再拆分时 extends RecursiveTask<Integer> { private final int start; private final int end; private 不应该在 RecursiveTask 内部使用 ForkJoinPool 的 invoke 方法。

    60320发布于 2021-08-17
  • 来自专栏Nicky's blog

    并发编程系列之什么是ForkJoin框架?

    2、ForkJoinTask ForkJoinTask是ForkJoin框架的提供的任务API,ForkJoinTask是一个抽象类,有两个主要的实现类,RecursiveTask和RecursiveAction ,其中RecursiveTask和RecursiveAction的主要区别是,RecursiveAction没有返回值,而RecursiveTask是有返回值的 3、ForkJoinPool ForkJoinPool java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask 修改记录 * 修改后版本: 修改人: 修改日期: 2021/10/12 16:22 修改内容: * */ public class Fibonacci extends RecursiveTask

    65420发布于 2021-10-19
  • 来自专栏悠扬前奏的博客

    Java并发-23.Fork/Join框架

    某些情况下存在竞争,消耗更多的系统资源 框架设计 ForkJoinTask:创建ForkJoin任务,用于分割一般不需要直接继承它,而是继承它的子类: RecursiveAction:没有返回结果的任务 RecursiveTask java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask ; /** * @author pengjunzhe */ public class CountTask extends RecursiveTask<Integer> { /**

    42620发布于 2019-05-31
  • 来自专栏后端码事

    Java并发之工具类 ForkJoin 任务分解

    RecursiveTask :用于有返回结果的任务。 java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask sum = new ForkJoinPool().invoke(task); System.out.println(sum); } } class MyTask extends RecursiveTask

    73720发布于 2020-09-11
  • 来自专栏Android相关

    Java并发---ForkJoin框架

    Fork&Join ForkJoin的任务 ForkJoin中的任务主要分为两个:RecursiveAction以及RecursiveTask。 而RecursiveTask则是带返回结果的Fork/Join任务,这类任务则是需要父任务等待子任务执行完后,使用子任务结果来合并任务结果。 执行任务 ForkJoin中可以使用三种方式开始执行任务: invoke 方法: 用来执行一个带返回值的任务(通常继承自RecursiveTask),并且该方法是阻塞的,直到任务执行完毕,该方法才会停止阻塞并返回任务的执行结果 Submit方法: 该 submit 方法用来执行带返回值的ForkJoinTask(通常继承自RecursiveTask)。 并且调用fork()开始并行执行子任务 子任务加入队列后,调用join()等待子任务执行完成后返回结果 计算子任务结果,将子任务结果返回给父任务,标识父任务完成 class SumTask extends RecursiveTask

    64820发布于 2018-12-28
  • 来自专栏编程从踩坑到跳坑

    ForkJoin框架

    RecursiveTask例子 /** * @author donghaibin * @date 2019-08-17 */ @RequiredArgsConstructor public class SumTask extends RecursiveTask<Integer> { private static final int THRESHOLD = 10; private Integer result = task.invoke(); System.out.println(result); } } 运行结果: 1050 RecursiveAction和RecursiveTask

    44110发布于 2019-12-19
  • 来自专栏java学习java

    Fork/Join解读

    RecursiveTask 和 RecursiveAction:这两个抽象类是用来表示可分解的任务的。 RecursiveTask 用于返回结果的任务,而 RecursiveAction 则用于不返回结果的任务。我们需要继承这些类,并实现 compute() 方法来执行任务划分和合并操作。 使用 提交给 Fork/Join 线程池的任务需要继承 RecursiveTask(有返回值)或 RecursiveAction(没有返回值),例如下 面定义了一个对 1~n 之间的整数求和的任务 class AddTask extends RecursiveTask<Integer> { int n; public AddTask(int n) { this.n = n join()2+{1}=3 join()3+{2}=6 join()4+{3}=10 join()5+{4}=15 15 用图来表示 改进 class AddTask3 extends RecursiveTask

    36930编辑于 2023-10-15
领券