`
lw671579557
  • 浏览: 106014 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Fork/Join小例子

    博客分类:
  • java
 
阅读更多

  1、使用Fork/Join并行查询业务,如例子中根据多个id查询XX业务,可以分割成多个子任务并行查询

public class ForkJoinDemoService extends RecursiveTask<List<MSGroupVO>>
{

    /**
     * 序列
     */
    private static final long serialVersionUID = -8887828259415562910L;
    
    /**
     * 子任务查询参数阈值
     */
    private static final int LIST_SIZE_THRESHOLD = 5;
    
    // 参数,id列表
    private List<String> idList;
    
    /**
     * 构造函数
     */
    public ForkJoinDemoService(List<String> idList)
    {
        this.idList = idList;
    }

    /**
     * 并行执行
     * @return
     */
    @Override
    protected List<MSGroupVO> compute()
    {
        // 获得业务Service实例
        IGroupRoleService groupRoleService = new GroupRoleService();
        
        // 查询结果
        List<MSGroupVO> list = new ArrayList<MSGroupVO>();
        // id个数少于阈值时,可以直接执行任务
        boolean canCompute = idList.size() <= LIST_SIZE_THRESHOLD;
        if(canCompute)
        {
            String ids = StringUtils.join(idList, ",");
            list = groupRoleService.findGroups(ids);
        }
        else
        {
            // 参数id个数超过设置的阈值,则分割成两个子任务
            int mid = idList.size() / 2; 
            List<String> leftList = idList.subList(0, mid);
            List<String> rightList = idList.subList(mid, idList.size());
            ForkJoinDemoService leftTask = new ForkJoinDemoService(leftList);
            ForkJoinDemoService rightTask = new ForkJoinDemoService(rightList);
            
            //执行子任务
            leftTask.fork();
            rightTask.fork();
            
            //等待子任务执行完,并得到结果
            List<MSGroupVO> leftResult = leftTask.join();
            List<MSGroupVO> rightResult = rightTask.join();
            
            // 汇总结果并返回
            list.addAll(leftResult);
            list.addAll(rightResult);
        }
        
        
        return list;
    }
    
    /*public static void main(String[] args)
    {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        
        List<String> ids = new ArrayList<String>();
        ids.add("1800");
        ids.add("1803");
        ids.add("1804");
        ids.add("2200");
        ids.add("2201");
        ids.add("2202");
        ids.add("2203");
        ids.add("2204");
        ids.add("2205");
        ids.add("2206");
        ids.add("2207");
        ForkJoinDemoService task = new ForkJoinDemoService(ids);
        Future<List<MSGroupVO>> result = forkJoinPool.submit(task);
        try
        {
           List<MSGroupVO> list = result.get();
           System.out.println(list);
        }
        catch (Exception e)
        {
        }
    }*/
}

 

 

 

分享到:
评论

相关推荐

    Fork/Join例子

    标题“Fork/Join例子”暗示我们将探讨一个具体的示例,展示如何使用这个框架来解决问题。通常,这样的例子会涵盖创建自定义的`RecursiveTask`或`RecursiveAction`类,以及如何使用`ForkJoinPool`来执行它们。 描述...

    fork/join 实例

    在这个方法中,你可以将大任务分解为更小的子任务,并调用`fork()`和`join()`。例如,一个简单的计算阶乘的例子: ```java static class Factorial extends RecursiveAction { private final int n; Factorial...

    Java并发Fork and join

    快速排序是一个经典的适合使用Fork/Join框架的例子。首先创建一个`RecursiveTask`来表示排序任务,任务会检查数组的大小,如果数组元素少于某个阈值,就直接排序(递归结束条件);否则,将数组一分为二,分别创建两...

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!

    ForkJoinTask是可分叉(fork)和可合并(join)的任务,它们能够将大任务分解为更小的部分,这些小任务可以在多个线程上并行执行,完成后再合并结果。 ForkJoinTask有两个主要的子类:RecursiveAction和...

    Java通过Fork/Join优化并行计算

    总的来说,Java的Fork/Join框架提供了一种结构化的方式,通过将大问题分解为小问题并并行处理这些小问题,来提高程序的执行效率。通过理解和熟练运用Fork/Join框架,开发者可以更好地利用多核处理器的优势,实现更...

    浅谈Java Fork/Join并行框架

    一个最简单的例子是使用 Fork/Join 框架来求一个数组中的最大/最小值,这个任务就可以拆成很多小任务,大任务就是寻找一个大数组中的最大/最小值,我们可以将一个大数组拆成很多小数组,然后分别求解每个小数组中的...

    Java Fork/Join框架

    Java Fork/Join框架是Java 7引入的一种并行计算模型,设计目的是为了高效地处理大量数据,尤其是在多核处理器环境中。该框架的核心理念是通过将复杂的大任务分解为多个小任务,然后并行执行这些小任务,从而加速计算...

    JDK7中的ForkJoin模式

    JDK 7 中引入的 Fork/Join 模式是一种基于分治策略的并行编程模型,旨在简化在多核处理器环境下实现高效的并行计算。这一模式的核心思想是将复杂的大任务拆分成一系列小任务,然后将这些小任务并行执行,最后再合并...

    ForkJoin并发框架入门示例

    ForkJoin并发框架是Java 7引入的一种高效并行计算框架,它基于分而治之(Divide and Conquer)的策略,适用于处理大量可分割的任务。这个框架的核心类是`ForkJoinPool`和`ForkJoinTask`,它们为开发者提供了创建和...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    下面是一个简单的Fork/Join框架的例子,假设我们要计算一个数组的累加和: ```java import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; public class SumCalculator ...

    基于JDK的ForkJoin构建一个简单易用的并发组件1

    虽然对于商品详情页面展示这个特定例子,直接使用线程池可能已经足够,但在处理更大规模、更复杂的问题时,ForkJoin框架能带来显著的性能提升。通过学习和熟练运用ForkJoin,开发者可以构建出更加灵活、高效的并发...

    Stream流式计算、ForkJoin和异步回调.md

    下面是一个简单的ForkJoin框架的应用示例,该示例展示了如何使用ForkJoin框架来计算一组数字的总和: ```java public class ForkJoinDemo extends RecursiveTask&lt;Long&gt; { private Long start; private Long end; ...

    ForkAndJoinUtility:实用程序类可轻松使用 java 中的 join 和 fork 功能

    JoinAndForkUtility 可轻松使用 java 7 中的 join 和 fork 功能的实用程序类。 易于使用并提高耗时 for 循环的性能。 更多的是尝试将 fork/join/compute 方法等与业务问题分离。用法如果您必须为大量对象循环耗时的...

    Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践

    Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等... 未完成模块:阿里Java手册、java8,注解,fork/join,加解密等。

    关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践 .zip

    未完成模块阿里Java手册、java8,注解,fork/join,加解密等。欢迎fork,欢迎交流。拿起微信,关注公众号「程序员泥瓦匠」给教程的开源代码仓库点个星吧GitHub(java-core-learning-example)Gitee(java核心学习...

    《Java7并发编程实战手册》书中实例代码

    例如,你可以找到使用Fork/Join框架实现的矩阵乘法,使用`ConcurrentHashMap`进行并发操作的例子,以及如何有效利用`CountDownLatch`、`CyclicBarrier`和`Semaphore`来控制并发流程的示例。 总之,《Java 7并发编程...

    java中的forkjoin框架的使用

    否则,任务会被拆分为两个子任务,分别处理数组的一半,然后将两个子任务的结果相加,这就是fork和join的过程。 在实际使用ForkJoinPool时,我们可以通过submit方法提交任务: ```java ForkJoinPool pool = new ...

    风辰的CUDA入门教程

    - **CUDA与Fork/Join**:在CUDA中,可以通过类似Fork/Join的方式来实现数据并行处理,但具体实现方式有所不同,更多依赖于CUDA的线程模型和内存模型。 **知识点2:CUDA线程模型** - **线程组织**:CUDA中的线程按照...

    SpringMVC+MyBatis整合小例子

    总的来说,"SpringMVC+MyBatis整合小例子"项目提供了一个实用的学习平台,帮助开发者理解这两个框架的协同工作原理,以及如何在实际开发中运用它们。通过实践这个项目,可以加深对Web应用开发的理解,提升技能水平。

    VisualC++利用多线程模拟并行计算.pdf

    在文档内容中提到了“BeginFork”和“EndFor”,这暗示了并行计算中常用的fork/join模型。在这种模型中,“fork”表示将一个任务分解成若干子任务,而“join”则表示等待所有子任务完成后,再合并这些子任务的结果...

Global site tag (gtag.js) - Google Analytics