Java多线程高并发中的Fork/Join框架机制详解
作者:张起灵-小哥 发布时间:2021-06-17 01:08:08
标签:Java,Fork,Join,框架
1.Fork/Join框架简介
Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:
Fork:把一个复杂任务进行分拆,大事化小 :把一个复杂任务进行分拆,大事化小
Join:把分拆任务的结果进行合并
在 Java 的 Fork/Join 框架中,使用两个类完成上述操作:
ForkJoinTask: 我们要使用 Fork/Join 框架,首先需要创建一个 ForkJoin 任务。该类提供了在任务中执行 fork 和 join 的机制。通常情况下我们不需要直接集成 ForkJoinTask 类,只需要继承它的子类,Fork/Join 框架提供了两个子类:
RecursiveAction:用于没有返回结果的任务
RecursiveTask:用于有返回结果的任务
ForkJoinPool: ForkJoinTask 需要通过 ForkJoinPool 来执行。
RecursiveTask: 继承后可以实现递归(自己调自己)调用的任务。
可以在jdk官方文档中看到:
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();
}
}
}
来源:https://szh-forever-young.blog.csdn.net/article/details/120799469


猜你喜欢
- C#程序自删除核心实现方法就是调用 cmd 传入命令行,等待几秒之后删除文件;应用程序在运行时,是不能将 exe 文件进行删除的。但是可以将
- 题外话:发现好久都没有上来写博文了,毕业设计加上公司暂时没有Android的项目做,只能去自学web上的知识,摸爬打滚到现在,花了一个多月时
- 实验环境hadoop版本:3.3.2jdk版本:1.8hadoop安装系统:ubuntu18.04编程环境:IDEA编程主机:windows
- LottieLottie 是 Airbnb 开源的一个动画项目,它支持 iOS, mac OS Android RN,由于某些复杂动画的实现
- 原装的Android标题栏配色比较单调,就是黑色的一坨,现在假设你的软件需要独自添加标题栏,这样不仅美观而且可以将进度条等加进去,如何实现:
- 一、首先下载 ZXing.Net地址是:http://zxingnet.codeplex.com/releases/view/117068然
- 啥都不说先上效果图,这个是我项目里的效果:下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的ok 下面 说一下思路把首先 说
- 记录查找自动组拼SQL语句的过程首先在BaseMapper其中的一个方法下打个断点在断点显示的值栏找到相关的SQL发现SQL语句在Mappe
- 本文实例汇总了Java文件操作。分享给大家供大家参考,具体如下:1.创建文件夹//import java.io.*; File myFold
- 图片象对:经过理处过的jpg格式的位图(头像照片) 算
- public static String toUtf8String(String s) {
- 一、POI的定义JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 200
- /// <summary> /// 读写INI文件的类。
- 本文实例为大家分享了unity shader实现玻璃折射的具体代码,供大家参考,具体内容如下Shader "Unlit/rende
- 1. AIE (演示地址)AIE是一个开源的ajax图片编辑器,基于ExtJS与PHP ImageMagick开发,易于与博客/相册等其它应
- 环境操作系统windows10JDKjdk1.8.0_192IDEEclipse IDE for Enterprise Java Devel
- 前言在unity的ugui中Text控件,有时我们会有各种各样的需求,比如类似html中css的text-overflow属性,希望一段文字
- 很多小伙伴都有修改Eclipse启动画面或图标的需求,寻找自己的个性化嘛,今天我就给大家说一下如何修改。一、 启动画面自定义第一种情况:.纯
- 我们都知道EditText与TextView是Android的文本输入框和文本显示框,但是基于手机屏幕的大小因素,如果在需要输入较多文字或者
- 一、可空类型修饰符(?)C#2.0里面实现了Nullable数据类型//A.比如下面一句,直接定义int为null是错误的,错误提示为无法将