java多线程与mapreduce_【Java多线程】Java的MapReduce框架ForkJoin

2023-05-16

Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

Fork就是把一个大任务切分为若干子任务并行的执行。类似MapReduce里面的Map。

Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。类似MapReduce里面的Reduce。

举例说明,统计1~100的和,并行运行, 每个线程计算20个数的,如果当前线程统计的数量多于20,就切分为两个线程运行,切分点为中间数,至少分配的每一个线程的统计数小于或等于20,这个分裂任务的过程就叫做Fork。最后各个线程向上汇报汇总结果,这个汇聚结果的过程就叫做Join。

流程图如下:

21.png

代码如下:import java.util.concurrent.ExecutionException;

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.Future;

import java.util.concurrent.RecursiveTask;

import java.util.concurrent.atomic.AtomicInteger;

class Calculator extends RecursiveTask

{

/**

*

*/

private static final long serialVersionUID = 1L;

/**

* 线程计数器

*/

public static AtomicInteger tcounter = new AtomicInteger(0);

/**

* 计算阀值

*/

private static final int THRESHOLD = 20;

/**

* 开始值

*/

private int start;

/**

* 结束值

*/

private int end;

public Calculator(int start, int end)

{

this.start = start;

this.end = end;

}

@Override

protected Integer compute()

{

tcounter.incrementAndGet();

System.out.println("start:" + start + ", end:" + end);

int sum = 0;

if((end - start) <= THRESHOLD)

{

/**

* 小于等于阀值,直接计算

*/

for(int i = start; i<= end; i++)

{

sum += i;

}

}

else

{

/**

* 大于阀值,任务分解, 并汇聚结果

*/

int middle = (start + end) / 2;

Calculator left = new Calculator(start, middle);

Calculator right = new Calculator(middle + 1, end);

left.fork();

right.fork();

sum = left.join() + right.join();

}

return sum;

}

}

public class TestForkJoinPool

{

public static void main(String[] args) throws InterruptedException, ExecutionException

{

ForkJoinPool forkJoinPool = new ForkJoinPool();

Future result = forkJoinPool.submit(new Calculator(1, 100));

System.out.println("结果: " + result.get() + ", " + Calculator.tcounter + "个线程参与了运算");

}

}

执行结果start:1, end:100

start:1, end:50

start:51, end:100

start:1, end:25

start:1, end:13

start:26, end:50

start:14, end:25

start:51, end:75

start:26, end:38

start:39, end:50

start:51, end:63

start:64, end:75

start:76, end:100

start:76, end:88

start:89, end:100

结果: 5050, 15个线程参与了运算

聊聊核心类,

ForkJoinPool:负责建立一个ForkJoin运行环境

ForkJoinTask: 表示实际运行的任务,一般使用它的两个子类,一个是RecursiveAction(任务不带返回值时使用),另一个是RecursiveTask(任务带返回值时使用)。按照情况选择任意一个, 使用时需要继承该子类,然后实现抽象方法compute【任务的逻辑就在compute方法里编写】。

ForkJoinTask.fork方法表示分裂任务, ForkJoinTask.join表示汇聚分裂任务的compute方法的执行结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java多线程与mapreduce_【Java多线程】Java的MapReduce框架ForkJoin 的相关文章

  • 群晖(Synology)配置 NAS + 软路由

    文章目录 背景结论软路由配置 背景 老板上周兴致勃勃的找到我 说Macbook存储不够用了 帮他找个存东西的 不是移动硬盘 我也很懵逼 我搞活动捡便宜充的百度网盘超级会员 觉得自己很是尾巴翘上天的土豪了 但想到老板的身价 又不太清楚macb
  • 各种类型的Writable

    各种类型的Writable xff08 Text ByteWritable NullWritable ObjectWritable GenericWritable ArrayWritable MapWritable SortedMapWri
  • C++ strtok的用法

    size 61 large align 61 center strtok的用法 align size 函数原型 xff1a char strtok char s char delim 函数功能 xff1a 把字符串s按照字符串delim进行
  • 读《遇见未知的自己》笔记

    为什么我不快乐 xff1f 为什么我不能拥有自己想要的生活 xff1f 此刻屏幕前的你 是否想过 xff0c 自己为什么会出现这种情况呢 xff1f 张德芬在 遇见未知的自己 一书给出了解释 xff1a 我们人类所有受苦的根源就是来自不清楚
  • PX4飞控问题汇总

    接触PX4飞控代码一年多了 xff0c 代码都是模块化 开发起来比APM的方便 xff0c 使用过程中也出现过各种怪异问题 xff0c 用的硬件是V5 nano 和V5 43 xff0c 测试的代码版本是1 9和1 10 今天总结一下遇到过
  • Sumo 搭建交叉路口交通流仿真平台

    Sumo安装 注意事项 xff1a 需要工具的使用需要环境变量的设置 需要包含文件Sumo安装路径下的bin和tools Sumo配置文件 Sumo中项目的配置文件的组成如下所示 节点文件 图 1 节点及边的拓扑图 Node的属性主要有id
  • OpenWRT 各种烧录方式及量产(三)

    界面烧录 不更新uboot 电脑连接WIFI xff08 或者通过网线连接电脑与路由器 xff09 通过浏览器访问路由器管理界面 xff0c 进行升级 注意不要断电 xff01 xff01 xff01 xff08 断电只能通过tftp方式恢
  • 华为手机root

    首先手机已解锁 xff42 xff4c 此方法针对 华为手机 可使用 xff0c 其他手机没有测试 xff0c 但应该也可以 官方的twrp没有对mate xff19 进行配适 xff0c 可以使用奇兔 twrp 提取码 ax6d 如果你没
  • 阿里云ubuntu 16.04 Server配置方案 2 远程控制桌面

    通过远程控制 xff0c 更好的管理服务器 1 XRDP远程控制 为了更好的远程管理 xff0c linux一般情况都用VNC进行远程连接 xff0c 如 TightVNC X11VNC ReadVNC等 Xrdp 是开放原始码的远端桌面通
  • 自顶向下(top down)简介

    无论是在实际生活中还是在学术问题上 xff0c 复杂的问题比比皆是 xff0c 当我们对此类问题毫无头绪的时候 xff0c 自顶向下 xff08 top down xff09 为我们提供了一种可靠的解决方法 自顶向下法将复杂的大问题分解为相
  • SecureCRT图形界面(通过设置调用Xmanager - Passive程序)

    首先 xff0c 在服务器进行设置 如果服务器是图形化界面启动的 xff0c xhost 43 命令可以不用执行 root 64 test xhost 43 xhost unable to open display 34 34 设置disp
  • 一种GPS辅助的多方位相机的VIO——Slam论文阅读

    34 A GPS aided Omnidirectional Visual Inertial State Estimator in Ubiquitous Environments 34 论文阅读 这里写目录标题 34 A GPS aided
  • docker & LXC

    目录 一 LXC1 了解Docker的前生LXC2 LXC与docker的关系3 与传统虚拟化对比4 LXC部署4 1 安装LXC软件包和依赖包4 2 启动服务4 3 创建虚拟机 5 LXC常用命令 二 doker1 什么是docker2
  • curl命令总结

    curl no cache d Users Administrator Desktop curl 7 73 0 3 win64 mingw bin gt curl Iv http abc gkmang cn 8081 index php l
  • 使用FastJSON 对Map/JSON/String 进行互转

    前言 Fastjson是一个Java语言编写的高性能功能完善的JSON库 xff0c 由阿里巴巴公司团队开发的 1 主要特性 高性能 fastjson采用独创的算法 xff0c 将parse的速度提升到极致 xff0c 超过所有json库
  • ai面向分析_2020年面向企业的顶级人工智能平台

    ai面向分析 In the long term artificial intelligence and automation are going to be taking over so much of what gives humans
  • 回答问题人工智能源码_回答21个最受欢迎的人工智能问题

    回答问题人工智能源码 Artificial intelligence sets the stage for a new era of solutions to be made with computers It allows us to s
  • 人工智能药物设计_用AI革新药物安全

    人工智能药物设计 介绍 Introduction Advances in the life sciences have brought about a transformative impact on healthcare with lif
  • 数据集分为训练验证测试_将数据集分为训练集,验证集和测试集

    数据集分为训练验证测试 测试我们的模型 Testing Our Model Supervised machine learning algorithms are amazing tools capable of making predict
  • 深度学习 场景识别_使用深度学习进行自然场景识别

    深度学习 场景识别 Recognizing the environment in one glance is one of the human brain s most accomplished deeds While the tremen

随机推荐