资讯专栏INFORMATION COLUMN

java并发编程学习之Fork/Join 框架-RecursiveTask(二)

TerryCai / 3363人阅读

摘要:示例计算一组数据,设置阈值为,也就是说每次计算的数量不超过个。总数总数运行结果如下可以看出,两次结果是一样的。创建继承的类,实现方法,这里主要是计算以及拆分任务合并结果。

示例

计算一组数据,设置阈值为50,也就是说每次计算的数量不超过50个。

public class RecursiveTaskDemo extends RecursiveTask {
    private static final int MAX = 50;
    private int[] arr;
    private int start;
    private int end;

    public RecursiveTaskDemo(int[] arr, int start, int end) {
        this.arr = arr;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if ((end - start) < MAX) {
            int sum = 0;
            for (int i = start; i <= end; i++) {
                sum += arr[i];
            }
            return sum;
        } else {
            int mid = (end + start) / 2;
            RecursiveTaskDemo left = new RecursiveTaskDemo(arr, start, mid);
            RecursiveTaskDemo right = new RecursiveTaskDemo(arr, mid + 1, end);
            invokeAll(left, right);
            return left.join() + right.join();
        }
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        int[] randomArr = getRandomArr(1000);
        RecursiveTaskDemo task = new RecursiveTaskDemo(randomArr, 0, randomArr.length - 1);
        System.out.println("总数1=" + pool.invoke(task));

        System.out.println("总数2=" + Arrays.stream(randomArr).parallel().sum());
    }

    public static int[] getRandomArr(int num) {
        int[] arr = new int[num];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Random().nextInt(1000);
        }
        return arr;
    }
}

运行结果如下:

可以看出,两次结果是一样的。

步骤

创建ForkJoinPool对象。

创建继承RecursiveTask的类,实现compute方法,这里主要是计算以及拆分任务、合并结果。

pool.invoke方法调用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75257.html

相关文章

  • java并发编程习之Fork/Join 框架-基本概念(一)

    摘要:思想把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。当双端队列只有一个任务时,线程之间会竞争。 思想 把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。 步骤如下: 任务分割 结果汇总 示例图 showImg(https://segmentfault.com/img/bVb...

    hikui 评论0 收藏0
  • 想进大厂?50个多线程面试题,你会多少?【后25题】(

    摘要:大多数待遇丰厚的开发职位都要求开发者精通多线程技术并且有丰富的程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。进入等待通行准许时,所提供的对象。 最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案。 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就...

    caozhijian 评论0 收藏0
  • Java 8 的 JVM 有多快?Fork-Join 性能基准测试

    摘要:这减轻了手动重复执行相同基准测试的痛苦,并简化了获取结果的流程。处理项目的代码并从标有注释的方法处生成基准测试程序。用和运行该基准测试得到以下结果。同时,和的基线测试结果也有略微的不同。 Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8。本文也将讨论最新发布在 JDK 中的并发功能更新。事实上,JDK 中已经有多处java.util.concurrent 改动,但...

    Euphoria 评论0 收藏0
  • Fork/Join框架

    摘要:框架框架简介框架是提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果得到大任务结果的框架。框架实例需求计算的结果。 Fork/Join框架 1. Fork/Join框架简介 Fork/Join框架是java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果得到大任务结果的框架。Fork指的就是把一个大任务...

    GitChat 评论0 收藏0
  • Fork/Join框架简介

    摘要:第二步执行任务并合并结果。使用两个类来完成以上两件事情我们要使用框架,必须首先创建一个任务。用于有返回结果的任务。如果任务顺利执行完成了,则设置任务状态为,如果出现异常,则纪录异常,并将任务状态设置为。 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的...

    W_BinaryTree 评论0 收藏0

发表评论

0条评论

TerryCai

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<