Java多线程高并发中的Fork/Join框架机制详解

作者:张起灵-小哥 时间:2021-06-17 01:08:08 

1.Fork/Join框架简介

Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:

Fork:把一个复杂任务进行分拆,大事化小 :把一个复杂任务进行分拆,大事化小

Join:把分拆任务的结果进行合并

Java多线程高并发中的Fork/Join框架机制详解

在 Java 的 Fork/Join 框架中,使用两个类完成上述操作:

ForkJoinTask: 我们要使用 Fork/Join 框架,首先需要创建一个 ForkJoin 任务。该类提供了在任务中执行 fork 和 join 的机制。通常情况下我们不需要直接集成 ForkJoinTask 类,只需要继承它的子类,Fork/Join 框架提供了两个子类:

  • RecursiveAction:用于没有返回结果的任务

  • RecursiveTask:用于有返回结果的任务

ForkJoinPool: ForkJoinTask 需要通过 ForkJoinPool 来执行。

RecursiveTask: 继承后可以实现递归(自己调自己)调用的任务。

可以在jdk官方文档中看到:

Java多线程高并发中的Fork/Join框架机制详解

2.简单应用

实现从 1 + 2 + ... + 100 ,将它们拆分成多个小任务,分别求和,最终再将这些结果合并。

这里就是参照官方文档,先继承RecursiveTask类,重写其中的compute方法,然后定义有参构造,而ForkJoinTask需要通过 ForkJoinPool 来执行,所以还需要创建 分支合并池ForkJoinPool对象。


package test.forkjoin;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
*
*/
class MyTask extends RecursiveTask<Integer> {
   //拆分差值不能超过10,每次计算10以内的连加操作
   private static final Integer NUMBER = 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) <= NUMBER) {
           //将区间内的值依次相加
           for (int i = begin; i <= end; i++) {
               result += i;
           }
       } else { //区间差值大于10,进一步拆分
           //获取中间值
           int middle = (begin + end) / 2;
           //拆分的左区间
           MyTask taskLeft = new MyTask(begin,middle);
           //拆分的右区间
           MyTask taskRight = new MyTask(middle + 1,end);
           //fork方法进行拆分
           taskLeft.fork();
           taskRight.fork();
           //join方法进行合并
           result = taskLeft.join() + taskRight.join();
       }
       return result;
   }
}

public class ForkJoinDemo {
   public static void main(String[] args) {
       //创建MyTask对象
       MyTask myTask = new MyTask(1,100);
       //创建分支合并池对象
       ForkJoinPool forkJoinPool = new ForkJoinPool();
       ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
       try {
           //获取最终合并后的结果
           Integer ans = forkJoinTask.get();
           System.out.println(ans);
       } catch (Exception e) {
           e.printStackTrace();
       }finally {
           //关闭池对象
           forkJoinPool.shutdown();
       }
   }
}

Java多线程高并发中的Fork/Join框架机制详解

来源:https://szh-forever-young.blog.csdn.net/article/details/120799469

标签:Java,Fork,Join,框架
0
投稿

猜你喜欢

  • 详解Java中NullPointerException异常的原因详解以及解决方法

    2023-01-22 20:13:28
  • WindowsForm实现TextBox占位符Placeholder提示功能

    2023-03-18 12:57:44
  • 解析Tars-Java客户端源码

    2023-04-08 01:18:39
  • java连接MySQl数据库实例代码

    2021-12-18 18:19:36
  • android获取当前手机号示例程序

    2022-09-10 04:57:06
  • Springboot+AOP实现返回数据提示语国际化的示例代码

    2021-08-18 19:49:12
  • 如何利用Jackson序列化忽略指定类型的属性详解

    2023-11-16 09:01:27
  • Redis 订阅发布_Jedis实现方法

    2023-11-10 03:38:41
  • Java有趣好玩的图形界面开发八个案例实现

    2022-12-20 06:20:35
  • SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解

    2021-10-14 16:45:44
  • 详解java关于对象的比较

    2022-12-11 01:28:55
  • java使用htmlparser提取网页纯文本例子

    2022-06-14 12:47:05
  • C#使用Objects Comparer进行对象比较

    2022-06-03 05:40:30
  • Java实现窗体程序显示日历

    2022-09-14 11:01:59
  • Java 基础之事务详细介绍

    2021-12-16 19:35:36
  • 浅析java实现数据加密问题

    2023-03-21 02:54:04
  • C#文件流读写和进度回调示例详解

    2022-08-12 14:52:31
  • Java保留两位小数的几种写法总结

    2022-04-19 06:53:06
  • SpringBoot整合WebSocket实现聊天室流程全解

    2021-07-03 23:35:21
  • spring boot中配置hikari连接池属性方式

    2022-11-13 06:06:44
  • asp之家 软件编程 m.aspxhome.com