首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从List<Long>的RecursiveTask中收集ForkJoinPool结果

Fork/Join是Java提供的一种并行执行任务的框架,它利用了多线程和分治的思想来实现任务的拆分和合并。在ForkJoinPool中,RecursiveTask是一个可以返回结果的任务,它可以将一个大的任务拆分成多个小任务并行执行,然后将各个小任务的结果合并得到最终的结果。

对于从List<Long>的RecursiveTask中收集ForkJoinPool结果的问题,可以按照以下步骤进行处理:

  1. 创建一个继承自RecursiveTask的自定义任务类,例如MyRecursiveTask。该任务类的泛型参数应为List<Long>,表示任务要处理的数据类型为Long类型的列表。
  2. 在MyRecursiveTask类中重写compute()方法,该方法负责执行任务的拆分和合并过程。在compute()方法中,首先判断任务是否足够小,如果是,则直接计算任务结果并返回。如果任务较大,则将任务拆分为多个子任务,使用invokeAll()方法提交子任务给ForkJoinPool执行,并利用fork()方法递归地拆分子任务。
  3. 在MyRecursiveTask类中定义一个List<Long>类型的成员变量,用于存储子任务的计算结果。
  4. 在MyRecursiveTask类中重写方法,例如addToResults(List<Long> results),用于将子任务的计算结果添加到成员变量中。
  5. 在MyRecursiveTask类中重写方法,例如getResult(),用于返回最终的计算结果。该方法将会在任务完成后被调用。

以下是一个示例的MyRecursiveTask类的实现:

代码语言:txt
复制
import java.util.List;
import java.util.concurrent.RecursiveTask;

public class MyRecursiveTask extends RecursiveTask<List<Long>> {
    private List<Long> dataList;

    public MyRecursiveTask(List<Long> dataList) {
        this.dataList = dataList;
    }

    @Override
    protected List<Long> compute() {
        if (dataList.size() <= 10) { // 当任务足够小的时候直接计算结果并返回
            return processData(dataList);
        } else {
            int mid = dataList.size() / 2;

            MyRecursiveTask leftTask = new MyRecursiveTask(dataList.subList(0, mid));
            MyRecursiveTask rightTask = new MyRecursiveTask(dataList.subList(mid, dataList.size()));

            invokeAll(leftTask, rightTask);

            List<Long> leftResult = leftTask.join();
            List<Long> rightResult = rightTask.join();

            addToResults(leftResult);
            addToResults(rightResult);

            return getResult();
        }
    }

    private List<Long> processData(List<Long> data) {
        // 处理数据的逻辑
        // ...
        return processedData;
    }

    private void addToResults(List<Long> results) {
        // 将子任务的结果添加到成员变量中
        dataList.addAll(results);
    }

    private List<Long> getResult() {
        // 返回最终的计算结果
        return dataList;
    }
}

通过以上步骤,我们完成了从List<Long>的RecursiveTask中收集ForkJoinPool结果的过程。在实际使用中,可以根据具体场景和需求进行适当的修改和优化。

推荐的腾讯云相关产品:由于不能提及具体云计算品牌商,这里无法给出腾讯云相关产品的推荐和产品介绍链接地址,请自行参考腾讯云官方文档和网站获取相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

阿里面试题带你认识ForkJoinPool

(future); } // 每个段结果相加 long sum = 0; for (Future future : list...ForkJoinPool任务 ForkJoinPool 任务分为两种: 一种是本地提交任务(Submission task,如 execute、submit 提交任务); 另外一种是 fork...ctl是ForkJoinPool中最重要控制字段,将下面信息按16bit为一组封装在一个long。...很容易看出RecursiveAction和RecursiveTask区别,前者没有result,getRawResult返回空,它们对应不需要返回结果和需要返回结果两种场景。...; (4)ForkjoinPool内部基于“工作窃取”算法实现; (5)每个线程有自己工作队列,它是一个双端队列,自己队列头存取任务,其它线程尾部窃取任务; (6)ForkJoinPool最适合于计算密集型任务

44310
  • 死磕 java线程系列之ForkJoinPool深入解析

    如果进一步优化,我们会自然而然地想到使用线程池来分段相加,最后再把每个段结果相加。 其它? Yes,就是我们今天主角——ForkJoinPool,但是它要怎么实现呢?...(future); } // 每个段结果相加 long sum = 0; for(Future future : list) {...问题:普通线程池能否实现ForkJoinPool这种计算方式呢,即大任务拆任务,任务拆小任务,最后再汇总? ? 你可以试试看(-᷅_-᷄) OK,下面我们正式进入ForkJoinPool解析。...顺序来处理工作队列任务; (4)为了最大化地利用CPU,空闲线程将从其它线程队列“窃取”任务来执行; (5)工作队列尾部窃取任务,以减少竞争; (6)双端队列操作:push()/pop...; (4)ForkjoinPool内部基于“工作窃取”算法实现; (5)每个线程有自己工作队列,它是一个双端队列,自己队列头存取任务,其它线程尾部窃取任务; (6)ForkJoinPool最适合于计算密集型任务

    69310

    【JUC基础】16. Fork Join

    因此,在实际执行过程,可能遇到这么一种情况: 线程 A 已经把自己任务都执行完了,而线程 B 还有一堆任务等着处理,此时,线程A 就会“帮助”线程 B,线程 B任务队列拿一个任务过来处理,尽可能地达到平衡...来看下执行结果代码,还有几个和平时使用不一样地方: CountTask继承了RecursiveTask main中线程池使用了ForkJoinPool 3.2、RecursiveTask Recursive...返回结果RecursiveTaskcompute()方法必须返回一个结果,类型与泛型参数V一致。任务执行完成后,可以通过get()方法或join()方法获取任务结果。...RecursiveAction不具备上面说到RecursiveTask泛型特性,以及无返回结果。...每个线程都有一个自己工作队列,当一个线程完成自己任务后,它可以其他线程工作队列窃取任务来执行。这种方式使得任务能够自动地在多个线程之间动态平衡,提高了并行执行效率。

    15110

    ForkJoinPool实践

    这个场景跟我之前写过自定义Java自定义异步功能实践有点异曲同工之妙,只不过这里有有个子任务概念,多个任务执行结果是具有相关性。资料指出ForkJoinPool比较适合计算密集型任务。...在性能测试QPS取样器和RT取样器,有这样一个使用场景,在用例执行过程,我想了解一下当前用例执行QPS和RT信息,就需要有个触发开关,开始收集这些数据,等某一个终止条件被触发,结束收集,然后计算结果...在用例QPS超过10万情况下,单次收集数据可能会超过100万,计算QPS和RT就非常适合ForkJoinPool来完成。...主要功能3个:创建任务ForkJoinPool、创建任务分配规则和收集任务结果。 下面我以一个数组求和Demo演示一下ForkJoinPool功能。...拆分任务思路如下:使用两个int属性,标记List需要求和片段索引。这样每次分配任务时候,只需要改变索引值即可。将一个很长List求和分成N个小片段求和。

    26130

    【进阶之路】多线程条件下分段处理List集合几种方法

    第一、为什么会出现类似于重复处理某一个模块问题? 我们都知道,在Java,每个线程都有自己独立工作内存,线程对共享变量所有操作都必须在自己工作内存中进行,不能直接主内存读写。...如果线程1修改内容想被线程2得到,那么线程1工作内存修改后共享变量需要先刷新到主内存,再把主内存更新过共享变量更新到工作内存2。....size()+"]==="+list1); } } 处理结果结果上来看,还是比较美好,通过CompletionService能够比较快速地分段处理任务,我之前也有提过,合理线程池大小设计有助于提高任务处理效率...ForkJoinPool框架通过初始化ForkJoinTask来执行任务,并提供了以下两个子类: RecursiveAction:用于没有返回结果任务。...RecursiveTask :用于有返回结果任务。 我们实现过程可以使用RecursiveTask方法来分段处理list集合。

    2.1K20

    Dating Java8系列之并行数据处理

    它是ExecutorService接口一个实现,它把子任务分配给线程池(称为ForkJoinPool)工作线程。...把任务提交到这个池,必须创建RecursiveTask一个子类,其中R是并行化任务(以及所有子任务)产生结果类型,或者如果任务不返回结果,则是RecursiveAction类型。...合并每个子任务结果 } 使用分支合并框架例子 执行递增求和任务 public class CalculatorSumTask extends RecursiveTask {...分支/合并框架工程用一种称为工作窃取(work stealing)技术来解决这个问题。在实际应用,这意味着这些任务差不多被平均分配到ForkJoinPool所有线程上。...每个线程都为分配给它任务保存一个双向链式队列,每完成一个任务,就会队列头上取出下一个任务开始执行。

    17210

    Java7任务并行执行神器:Fork&Join框架

    工作窃取算法 ForkJoin采用了工作窃取(work-stealing)算法,若一个工作线程任务队列为空没有任务执行时,便其他工作线程获取任务主动执行。...为了实现工作窃取,在工作线程维护了双端队列,窃取任务线程队尾获取任务,被窃取任务线程队头获取任务。这种机制充分利用线程进行并行计算,减少了线程竞争。...ForkJoinPool ForkJoinPool是ForkJoin框架任务调度器,和ThreadPoolExecutor一样实现了自己线程池,提供了三种调度子任务方法: execute:异步执行指定任务...,无返回结果; invoke、invokeAll:异步执行指定任务,等待完成才返回结果; submit:异步执行指定任务,并立即返回一个Future对象; ForkJoinTask Fork/Join框架实际执行任务类...RecursiveAction:用于无结果返回子任务; RecursiveTask:用于有结果返回子任务; Fork/Join框架实战 下面实现一个Fork/Join小例子,1+2+...10亿,

    1.3K90

    【JDK8 新特性 7】并行Stream流¶llelStream背后技术

    上一篇文章:(1条消息) 【JDK8 新特性 6】收集Stream流结果_一切总会归于平淡博客-CSDN博客 目录 1、获取并行Stream流两种方式 1.1 直接获取并行流 1.2 将串行流转成并行流...、 我们明明是往集合添加1000个元素,而实际上只有894个元素。...Fork/Join工作窃取(work-stealing)算法是指某个线程其他队列里窃取任务来执行。 那么为什么需要使用工作窃取算法呢?...可以通过设置系统属性:java.util.concurrent.ForkJoinPool.common.parallelism=N (N为线程数量),来调整ForkJoinPool线程数量,可以尝试调整成不同参数来观察每次输出结果...extends RecursiveTask { /** * 拆分临界值 */ private static final long THRESHOLD

    77620

    Fork Join 并发任务执行框架

    就是在按指定阈值拆分后,多个线程,如果线程A任务执行比较快,获得到CPU时间片比较多,那么在他执行完毕后,就会从未执行完毕线程任务尾部,进行任务窃取,任务完成后再把结果放回去,不会造成任务竞争...,因为自身执行线程任务是从头部开始获取,而空闲线程是尾部窃取....image.png Fork Join使用标准范式 image.png 在使用过程我们是无法直接new 一个ForkJoinTask类,他是一个抽象类,但是他提供了两个子类,RecursiveTask...long l = System.currentTimeMillis(); // 创建一个任务 下标因为0开始所以结束下标需要-1 SumTask sumTask =...执行结果可以看到,主线程执行时在ForkJoin执行之前就执行了,但是代码却是在ForkJoin执行之后执行,所以说这是异步,线程是并行执行,异步执行只能通过调用任务线程Join方法获取返回值

    42531

    深入解析JavaForkJoinPool:分而治之,并行处理利器

    ForkJoinPool工作线程会不断地任务队列取出这些小任务进行处理。当一个小任务处理完成后,其结果会被合并到其他小任务结果,最终得到大任务处理结果。 2.2....每个工作线程都有自己任务队列,当某个线程完成了自己队列所有任务时,它会尝试其他线程队列窃取任务来执行。 工作窃取算法实现基于双端队列(Deque)。...任务拆分与合并 在ForkJoinPool,任务拆分和合并是通过继承自RecursiveAction或RecursiveTask类来实现。...RecursiveTaskForkJoinPool中用于有返回值任务基类。在这个类,我们需要实现compute方法来定义任务处理逻辑。...但是在这个案例,由于我们任务类继承自RecursiveTask,我们可以直接调用任务对象join方法来获取结果,而无需使用Future对象。

    19210

    ForkJoinPool 你真的明白和用对了吗

    这些进程每一个都存储在一个双端队列(Deque)。一旦工作线程任务用完,它就开始其他工作线程窃取任务。 首先,会有分岔任务过程。这意味着一个大任务将被分解成可以并行执行小任务。...最后,ForkJoinPool 类通过 Join 方式提供一个输出结果,如下图所示。 当任务在 ForkJoinPool 中提交时,该进程将被分成更小进程并推送到共享队列。... RecursiveAction 要记住重要一点是,它不返回值。还可以通过使用分而治之策略来分解这个过程,从而提高性能。...RecursiveAction 和 RecursiveTask 之间区别在于,使用 RecursiveTask,我们可以在compute() 方法返回一个值。...ForkJoinPool 框架主要类包括 ForkJoinPool、RecursiveAction 和RecursiveTask: RecursiveAction 用于计算递归操作,它不返回任何值

    1.1K10

    多线程—ForkJoinPool

    为什么要用ForkJoinPool?...ForkJoinPool优势在于,可以充分利用多cpu,多核cpu优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可...在一个任务,先检查将要解决问题大小,如果大于一个设定大小,那就将问题拆分成可以通过框架来执行小任务。...如果问题大小比设定大小要小,就可以直接在任务里解决这个问题,然后,根据需要返回任务结果。下面的图形总结了这个原理。 ?...RecursiveAction:没有返回值,只是执行任务,RecursiveTask:有返回值,小任务结束后,返回结果。大任务可将小任务返回结果进行整合。

    63830

    Java8 - 一文搞定ForkJoin 框架

    它是 ExecutorService 接口一个实现,它把子任务分配给线程池(称为 ForkJoinPool工作线程。...我们可以通过继承来实现一个RecursiveAction RecursiveTask :用于有返回结果任务。 可以将自己工作分割为若干更小任务,并将这些子任务执行合并到一个集体结果。...当一个工作线程队列里暂时没有任务时,它会随机其他工作线程队列尾部获取一个任务。 ?...---- RecursiveTask 实现 并行计算 要把任务提交到这个池,必须创建 RecursiveTask 一个子类,其中 R 是并行化任务(以及所有子任务)产生结果类型,或者如果任务不返回结果...在ForkJoinPool 执行时,最后一个方法返回值就是 ForkJoinSumCalculator 类定义任务结果。 在实际应用时,使用多个 ForkJoinPool 是没有什么意义

    39820

    Java并发---ForkJoin框架

    Fork&Join ForkJoin任务 ForkJoin任务主要分为两个:RecursiveAction以及RecursiveTask。...而RecursiveTask则是带返回结果Fork/Join任务,这类任务则是需要父任务等待子任务执行完后,使用子任务结果来合并任务结果。...执行任务 ForkJoin可以使用三种方式开始执行任务: invoke 方法: 用来执行一个带返回值任务(通常继承自RecursiveTask),并且该方法是阻塞,直到任务执行完毕,该方法才会停止阻塞并返回任务执行结果...,调用join()等待子任务执行完成后返回结果 计算子任务结果,将子任务结果返回给父任务,标识父任务完成 class SumTask extends RecursiveTask {...而其他线程队列还有任务需要处理但是该线程处于工作状态,那么空闲线程可以其他线程队列队尾取一个任务来帮忙运行。

    52120

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

    大数据:Map Reduce(把大任务拆分成多个小任务,怎么拆分用到了二分算法),每个小任务得出自己结果,之后再把结果汇总,汇总过程就是分支合并思想。...ForkJoin:分支合并 ForkJoin会把一个大任务分成若干个小任务去执行(任务是双端队列去存储,两端都可以操作),然后再合并结果集。...有一个异步执行任务方法 我们需要用到有返回值RecursiveTask 使用RecursiveTask需要继承RecursiveTask,并定义返回值类型 class Fibonacci extends...,通过ForkJoinPool来执行 * 2.计算任务forkJoinPool.execute(ForkJoinTask task) * 3.计算类要继承ForkJoinTask(执行任务RecursiveTask...* * 分析: * 当前ForkJoinWorkerThread可以说join之后什么事情都没有做,只是等待ing。而task1和task2会在新线程执行。

    32930

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

    1、什么是ForkJoin框架 ForkJoin框架是javaJUC包里提供,用于处理一些比较繁重任务,会将这个大任务分为多个小任务,多个小任务处理完成后会将结果汇总给Result,体现是一种“...第一步,拆分fork任务,将大任务分为多个小任务;第二步,归并join,会将小任务处理结果进行归并为一个结果。...2、ForkJoinTask ForkJoinTask是ForkJoin框架提供任务API,ForkJoinTask是一个抽象类,有两个主要实现类,RecursiveTask和RecursiveAction...,其中RecursiveTask和RecursiveAction主要区别是,RecursiveAction没有返回值,而RecursiveTask是有返回值 3、ForkJoinPool ForkJoinPool...框架可以用于一些递归遍历场景,对于斐波那契数列,你可以比较熟悉,因为在面试中有时候经常问到,斐波那契数列特点就是最后一项结果等于前面两项和 package com.example.concurrent.forkjoin

    54420
    领券