ForkJionPool线程池

分而治之
        简单点说, 如果要处理的 1000 个数据 , 但是我们不具备处理1000 个数据的能力 , 可以只处理 10
个数据, 可以把这 1000 个数据分阶段处理 100 , 每次处理 10 , 100 次的处理结果进行合成,
形成最后这 1000 个数据的处理结果 . 把一个大任务调用 fork() 方法分解为若干小的任务 , 把小任务
的处理结果进行 join()合并为大任务的结果
ForkJoinPool 线程池中最常用 的方法是 :
<T> ForkJoinTask<T> submit(ForkJoinTask<T> task) 向线程池提交 一个 ForkJoinTask 任务 .
ForkJoinTask 任务支持 fork() 分解与 join() 等待的 任 务 .
ForkJoinTask 有 两 个 重 要 的 子 类 :
       
 RecursiveAction 和 RecursiveTask ,
        
它们的区别在于 RecursiveAction 任务没有返回值 , RecursiveTask 任务可以带有返回值
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
public class Tets {//计算数列的和, 需要返回结果,可以定义任务继承 RecursiveTaskprivate static class CountTask extends RecursiveTask<Long> {private static final int THRESHOLD = 10000; //定义数据规模的阈值,允许计算10000 个数内的和,超过该阈值的数列就需要分解private static final int TASKNUM = 100; //定义每次把大任务分解为 100 个小任务private long start; //计算数列的起始值private long end; //计算数列的结束值public CountTask(long start, long end) {this.start = start;this.end = end;}//重写 RecursiveTask 类的 compute()方法,计算数列的结果@Overrideprotected Long compute() {long sum = 0 ; //保存计算的结果
//判断任务是否需要继续分解,如果当前数列 end 与 start 范围的数超过阈值THRESHOLD,就需要继续分解if ( end - start < THRESHOLD){
//小于阈值可以直接计算for (long i = start ; i <= end; i++){sum += i;}}else { //数列范围超过阈值,需要继续分解
//约定每次分解成 100 个小任务,计算每个任务的计算量long step = (start + end ) / TASKNUM;
//start = 0 , end = 200000, step = 2000, 如果计算[0,200000]范围内数列的// 和, 把该范围的数列分解为 100 个小任务,每个任务计算 2000 个数即可
//注意,如果任务划分的层次很深,即 THRESHOLD 阈值太小,每个任务的计//               算量很小,层次划分就会很深,可能出现两种情况:一是系统内的线程数量会越积越多,导致性//               能下降严重; 二是分解次数过多,方法调用过多可能会导致栈溢出
//创建一个存储任务的集合ArrayList<CountTask> subTaskList = new ArrayList<>();long pos = start; //每个任务的起始位置for (int i = 0; i < TASKNUM; i++) {long lastOne = pos + step; //每个任务的结束位置
//调整最后一个任务的结束位置if ( lastOne > end ){lastOne = end;}
//创建子任务CountTask task = new CountTask(pos, lastOne);
//把任务添加到集合中subTaskList.add(task);
//调用 for()提交子任务task.fork();
//调整下个任务的起始位置pos += step + 1;}
//等待所有的子任务结束后,合并计算结果for (CountTask task : subTaskList) {sum += task.join(); //join()会一直等待子任务执行完毕返回执行结果}}return sum;}}public static void main(String[] args) {
//创建 ForkJoinPool 线程池ForkJoinPool forkJoinPool = new ForkJoinPool();
//创建一个大的任务CountTask task = new CountTask(0L, 200000L);
//把大任务提交给线程池ForkJoinTask<Long> result = forkJoinPool.submit(task);try {Long res = result.get(); //调用任务的 get()方法返回结果System.out.println("计算数列结果为:" + res);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}
//验证long s = 0L;for (long i = 0; i <= 200000 ; i++) {s += i;}System.out.println(s);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 Python的面向对象编程

概述 在上一节&#xff0c;我们介绍了Python的函数&#xff0c;包括&#xff1a;函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中&#xff0c;我们将介绍Python的面向对象编程。面向对象编程&#xff08;Object-Oriented Programming, 即OOP&#xff09;是一种…

系统架构设计师之缓存技术:Redis与Memcache能力比较

系统架构设计师之缓存技术&#xff1a;Redis与Memcache能力比较

OpenCV使用CMake和MinGW-w64的编译安装

OpenCV使用CMake和MinGW-w64的编译安装中的问题 问题&#xff1a;gcc: error: long: No such file or directory** C:\PROGRA~2\Dev-Cpp\MinGW64\bin\windres.exe: preprocessing failed. modules\core\CMakeFiles\opencv_core.dir\build.make:1420: recipe for target ‘modul…

Git如何操作本地分支仓库?

基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。多线程开发,可以同时开启多个任务的开发&#xff0c;多个任务之间互不影响。 为何要…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

Cohere API 之旅

Cohere API之旅 0. 背景1. Cohere提供的模型和函数2. Cohere 客户端3. Co.Generate API4. Co.Embed API5. Co.Classify API6. Co.Tokenize API7. Co.Detokenize API8. Co.Detect_language9. Co.Summarize API10. Co.Rerank API 0. 背景 大约两个月前有一份新闻稿。 https://w…

合并两个有序数组【leetcode】

1. 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&…

测试框架pytest教程(9)跳过测试skip和xfail

skip无条件跳过 使用装饰器 pytest.mark.skip(reason"no way of currently testing this") def test_example(faker):print("nihao")print(faker.words()) 方法内部调用 满足条件时跳过 def test_example():a1if a>0:pytest.skip("unsupported …

基于Redis的BitMap实现签到、连续签到统计(含源码)

微信公众号访问地址&#xff1a;基于Redis的BitMap实现签到、连续签到统计(含源码) 推荐文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附…

python小脚本——批量将PDF文件转换成图片

语言&#xff1a;python 3 用法&#xff1a;选择PDF文件所在的目录&#xff0c;点击 确定 后&#xff0c;自动将该目录下的所有PDF转换成单个图片&#xff0c;图片名称为: pdf文件名.page_序号.jpg 如运行中报错&#xff0c;需要自行根据报错内容按照缺失的库 例如&#x…

ORB-SLAM系列算法演进

ORB-SLAM算法是特征点法的代表&#xff0c;当前最新发展的ORB-SLAM3已经将相机模型抽象化&#xff0c;适用范围非常广&#xff0c;虽然ORB-SLAM在算法上的创新并不是很丰富&#xff0c;但是它在工程上的创新确实让人耳目一新&#xff0c;也能更好的为AR、机器人的算法实现落地。…

CF 514 C Watto and Mechanism(双哈希)

CF 514 C. Watto and Mechanism(双哈希) Problem - 514C - Codeforces 大意&#xff1a;给出 n 个字典串 &#xff0c;现给出 m 个查询串 &#xff0c; 问是否存在字典串与当前查询串仅差一个字母。每个串仅包含 {‘a’ , ‘b’ , ‘c’ } 三个字母 。 思路&#xff1a;考虑…

Linux编程:在程序中异步的调用其他程序

Linux编程:execv在程序中同步调用其他程序_风静如云的博客-CSDN博客 介绍了同步的调用其他程序的方法。 有的时候我们需要异步的调用其他程序,也就是不用等待其他程序的执行结果,尤其是如果其他程序是作为守护进程运行的,也无法等待其运行的结果。 //ssss程序 #include …

操作教程|通过1Panel开源Linux面板快速安装DataEase

DataEase开源数据可视化分析工具&#xff08;dataease.io&#xff09;的在线安装是通过在服务器命令行执行Linux命令来进行的。但是在实际的安装部署过程中&#xff0c;很多数据分析师或者业务人员经常会因为不熟悉Linux操作系统及命令行操作方式&#xff0c;在安装DataEase的过…

LeetCode42.接雨水

这道题呢可以按列来累加&#xff0c;就是先算第1列的水的高度然后再加上第2列水的高度……一直加到最后就是能加的水的高度&#xff0c;我想到了这里然后就想第i列的水其实就是第i-1列和i1列中最小的高度减去第i列的高度&#xff0c;但是其实并不是&#xff0c;比如示例中的第5…

【蓝桥杯】 [蓝桥杯 2015 省 A] 饮料换购

原题链接&#xff1a;https://www.luogu.com.cn/problem/P8627 1. 题目描述 2. 思路分析 小伙伴们可以看看这篇文章~ https://blog.csdn.net/m0_62531913/article/details/132385341?spm1001.2014.3001.5501 我们这里主要讲下方法二的推导过程&#xff1a; 列方程。 设最…

企业数字化转型需要解决哪些问题?

随着信息技术的不断发展和应用&#xff0c;企业数字化转型已成为提高竞争力和实现可持续发展的必经之路。合沃作为一家专注于为企业提供工业物联网产品与解决方案的企业&#xff0c;拥有丰富的经验和技术实力&#xff0c;正致力于助力企业实现数字化转型。本文将探讨企业数字化…

流的基本概念

流的基本概念 Streaming 101与Streaming 102原文网页 文章目录 流的基本概念术语什么是流无界数据无界数据处理有界数据批处理引擎流引擎低延迟、近似、推测结果正确性时间推理工具 数据处理模式使用经典批处理引擎进行有界数据处理用经典批处理引擎通过临时固定窗口进行无界数…

物联网无线通信方式总结

本文主要内容(一些物联网无线通信方式) 本文将介绍一些物联网无线通信方式的技术特点、底层调制方式和主要应用场景物联网无线通信方式是指利用无线技术实现物体之间的信息交换和网络连接的方式物联网无线通信方式的选择需要考虑多种因素&#xff0c;如传输距离、功耗、数据速…

天翼物联、汕头电信与汕头大学共建新一代信息技术与数字创新(物联网)联合实验室

近日&#xff0c;在工业和信息化部和广东省人民政府共同主办的2023中国数字经济创新发展大会上&#xff0c;天翼物联、汕头电信与汕头大学共建“新一代信息技术与数字创新&#xff08;物联网&#xff09;”联合实验室签约仪式举行。汕头大学校长郝志峰、中国电信广东公司总经理…