Java并发编程之Fork/Join框架的理解
作者:小志的博客 发布时间:2023-09-30 14:14:01
标签:java,Fork,Join,框架
一、Fork/Join框架的理解
ForkJoinTask类属于java.util.concurrent 包下;
ForkJoinTask类下有2个子类,分别为RecursiveTask和RecursiveAction类;(lz示例中使用RecursiveTask类进行重写compute()方法进行实现数值的累加计算)
ForkJoinTask类 将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。
二、Fork/Join框架使用示例
示例场景:对数值进行累加计算;
注:示例中使用ForkJoinTask类的子类(RecursiveTask类)进行重写compute()方法进行实现数值的累加计算
1、代码
package com.xz.thread.ForkJoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @description:
* @author: xz
* @create: 2021-06-06 17:15
*/
public class Demo extends RecursiveTask<Integer> {
private int start;//子任务开始计算的开始值
private int end;//子任务开始计算的结束值
private static final Integer MAX_VALUE = 50;
//构造方法
public Demo(int start, int end) {
this.start = start;
this.end = end;
}
//计算
@Override
protected Integer compute() {
int sum =0;
//如果所需要计算的数值拆分为足够小,则进行累加计算
if(end-start <= MAX_VALUE){
System.out.println("startValue = " + start + ";endValue = " + end);
for(int i=start;i<=end;i++){
sum +=i;
}
}else{//否则再进行任务拆分,拆分成2个子任务
Demo d1 = new Demo(start, (start + end) / 2);
Demo d2 = new Demo((start + end) / 2, end);
//执行2个子任务
d1.fork();
d2.fork();
//合并子任务
Integer value1= d1.join();
Integer value2= d2.join();
sum =value1+value2;
}
return sum;
}
//测试
public static void main(String[] args) throws Exception{
//ForkJoinPool主要用于实现“分而治之”的算法,特别是分治之后递归调用的函数
ForkJoinPool forkJoinPool = new ForkJoinPool();
//提交一个ForkJoinTask执行
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(new Demo(1,200));
System.out.println("计算结果="+forkJoinTask.get());
}
}
2、运行测方法,输出如下:
3、结论:
由第2步骤的输出结果可知,先把1到200的所有数值进行任务拆分(上图拆分成了4部分),然后再将所有子任务结的果合并成最后的计算结果
来源:https://wwwxz.blog.csdn.net/article/details/117636005


猜你喜欢
- 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongodb.co
- Android 自定义输入支付密码的软键盘 &
- 前言:阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消
- 今天我们要开始来讲讲Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化数组概述:数组可以看成是多个相同类型数据的组合,对这些数
- Java的super关键字当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。为了解决这个问题,在Java中专门提供了一个sup
- 本文实例为大家分享了C#基于Socket的TCP通信实现聊天室的具体代码,供大家参考,具体内容如下一、Socket(套接字)通信概念套接字(
- 数组的用处是什么呢?——当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录
- 第一种方法:获取手机的IMSI码,并判断是中国移动\中国联通\中国电信TelephonyManager telManager = (Tele
- 如何使用必应地图 WPF 控件框架使用.NET40;Visual Studio 2019;Bing Maps WPF 控件需要&n
- 因为公司现在换成了nacos,所以自己写了demo学习一下。结果第一步就走不下去。在使用nacos-config读取nacos配置时。发现b
- 提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的OkHttp。而在Java11之前
- 好久没有写过文章,最近发现直播特别的火,很多app都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕
- 一、SpringBoot中的main方法注入service在springboot中使用main方法常规无法注入service,因为以后也可能
- Android 调用系统应用的方法总结1、调用系统拍照Intent intent = new Intent("andr
- 前言开发中,免不了会用到多边形、多角星等图案,比较常用的多边形比如雷达图、多角星比如评价星级的五角星等,本篇文章就使用Flutter绘制封装
- Mybatis有什么用前两天跟阿里的大牛聊天,他讲到对于性能要求高,需求变化多的互联网项目来说,用在sql优化上的开发时间是大头,有时候代码
- 问题?在很多公司(如阿里、华为等)的编程规范中,非常明确地禁止使用Executors快捷创建线程池,为什么呢?这里从源码讲起,介绍使用Exe
- 基本操作示例VectorApp.javaimport java.util.Vector; import java.lang.*; impor
- Java 散列存储Java中散列存储的数据结构主要是指HashSet、HashMap、LinkedHashSet、LinkedHashMap
- 具体详情如下所示:int -> Stringint i=12345;String s="";第一种方法:s=i+&