11. Fork与Join分支

news/2024/5/20 9:27:32 标签: 排序算法, juc, 进程, Fork与Join分支

将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果
该算法相当于递归,且是二分查找思路

八种基本排序问题 (第六篇 归并排序)图文详解_想成为大神说32的博客-CSDN博客

class Fibonacci extends RecursiveTask<Integer> {
   final int n;
   Fibonacci(int n) { this.n = n; }
   Integer compute() {
     if (n <= 1)
        return n;
     Fibonacci f1 = new Fibonacci(n - 1);
     f1.fork();
     Fibonacci f2 = new Fibonacci(n - 2);
     return f2.compute() + f1.join();
   }
 }

    ForkJoinTask:我们要使用 Fork/Join 框架,首先需要创建一个 ForkJoin 任务。该类提供了在任务中执行 fork 和 join 的机制。通常情况下我们不需要直接集成 ForkJoinTask 类,只需要继承它的子类,Fork/Join 框架提供了两个子类:
    RecursiveAction:用于没有返回结果的任务
    RecursiveTask:用于有返回结果的任务
    ForkJoinPool:ForkJoinTask 需要通过 ForkJoinPool 来执行
    RecursiveTask: 继承后可以实现递归(自己调自己)调用的任务

创建分支合并对象 通过该对象调用内部方法

具体案例:1加到100,相加两个数值不能大于10

class MyTask extends RecursiveTask<Integer> {

    //拆分差值不能超过10,计算10以内运算
    private static final Integer VALUE = 10;
    private int begin ;//拆分开始值
    private int end;//拆分结束值
    private int result ; //返回结果

    //创建有参数构造
    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }

    //拆分和合并过程
    @Override
    protected Integer compute() {
        //判断相加两个数值是否大于10
        if((end-begin)<=VALUE) {
            //相加操作
            for (int i = begin; i <=end; i++) {
                result = result+i;
            }
        } else {//进一步拆分
            //获取中间值
            int middle = (begin+end)/2;
            //拆分左边
            MyTask task01 = new MyTask(begin,middle);
            //拆分右边
            MyTask task02 = new MyTask(middle+1,end);
            //调用方法拆分
            task01.fork();
            task02.fork();
            //合并结果
            result = task01.join()+task02.join();
        }
        return result;
    }
}
public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建MyTask对象
        MyTask myTask = new MyTask(0,100);
        //创建分支合并池对象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        //获取最终合并之后结果
        Integer result = forkJoinTask.get();
        System.out.println(result);
        //关闭池对象
        forkJoinPool.shutdown();
    }
}


 


http://www.niftyadmin.cn/n/1712914.html

相关文章

数据结构——交换排序(冒泡排序和快速排序。)

交换排序 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 冒泡排序 1、比较相邻的元素。如果第一个比第…

12. 异步回调

CompletableFuture 在 Java 里面被用于异步编程&#xff0c;异步通常意味着非阻塞&#xff0c;可以使得我们的任务单独运行在与主线程分离的其他线程中&#xff0c;并且通过回调可以在主线程中得到异步任务的执行状态&#xff0c;是否完成&#xff0c;和是否异常等信息 类中的…

数据结构————哈希表的实现(语言)

哈希表 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&…

排序算法(对三个数进行排序三指针)

思路 采用三个指针 1&#xff09;头指针之前都是第一个数 2&#xff09;尾指针之后都是地三个数 3&#xff09;两个指针之间是第二个数 看一下例子&#xff1a; 例如对{1&#xff0c;0&#xff0c;0&#xff0c;2&#xff0c;2&#xff0c;1&#xff0c;0&#xff0c;2}进行排…

Java后端对 前端的学习了解 ,基础知识和各框架功能发展概述,以及了解前后端的分离史

Bootstrap可视化布局系统 (bootcss.com) 这是一个创建可视化布局的生成前端代码&#xff0c;根据你的需要&#xff0c;拖到按钮&#xff0c;然后就可以复制生成的代码 提示&#xff1a;学习一门技术&#xff0c;最好的方式就是官方文档&#xff0c;可以看完视频&#xff0c;笔…

数据结构————栈(力扣)

栈 来源&#xff1a;1381. 设计一个支持增量操作的栈 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/design-a-stack-with-increment-operation typedef struct { int *a; //用数组表示一个栈int size; //…

Vue 的七大 常用属性

1.el属性 用来指示vue编译器从什么地方开始解析 vue的语法&#xff0c;可以说是一个占位符。 相当于一个容器&#xff0c;跟上面的div id "app"做关联&#xff0c;从此以后上面div id "app"里面的内容要通过vue来渲染,都要经过vue处理才能看得到上面div里…

C语言实现LRU缓存机制——哈希表+双向链表

题目描述 题目来源&#xff1a; https://leetcode-cn.com/problems/lru-cache/ 运用你所掌握的数据结构&#xff0c;设计和实现一个LRU&#xff08;最近最少使用&#xff09;缓存机制。它应该支持以下操作&#xff1a;获取数据get和写入数据 put。 获取数据get&#xff08;key…