分而治之:Fork/Join框架(构造一个1到200 000求和的任务)

news/2024/10/17 23:28:09/

Fork一词的原始含义是吃饭用的叉子,也有分叉的意思。在linux平台中,
方法fork用来创建子进程。使得系统进程可以多一个执行分组。
而join方法这里表示等待,也就是使用fork方法后系统多了一个执行分支(线程)
所以需要等待这个执行分支执行完毕,才有可能得到最终的结果。因此join方法
就表示等待。
毫无顾忌地使用fork方法开启线程处理,严重影响性能。JDK中,给出了一个ForkJoinPool
线程池。
由于线程池的优化,提交的任务和线程数量并不一一对应的关系。在绝大多数的情况下,
一个物理线程实际上需要处理多个逻辑任务的。因此,每个线程必然需要拥有一个任务队列。
因此在实际执行过程中,可能遇到一种情况:线程A已经把自己的任务都执行完了,而线程
B还有一大堆任务等着处理。

public class CountTask extends RecursiveTask<Long> {private static final int THRESHOLD = 10000;private long start;private long end;public CountTask(long start,long end){this.start = start;this.end = end;}protected Long compute() {long sum = 0;boolean canCompute = (end-start)<THRESHOLD;if(canCompute){for(long i=start;i<end;i++){sum +=i;}} else {long step =(start +end)/100;ArrayList<CountTask> subTasks = new ArrayList<CountTask>();long pos = start;for(int i=0;i<100;i++){long lastOne = pos+step;if(lastOne>end) lastOne = end;CountTask subTask = new CountTask(pos,lastOne);pos+=step+1;subTasks.add(subTask);subTask.fork();}for(CountTask t:subTasks){sum+= t.join();}}return sum;}public  static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool();CountTask task = new CountTask(0,200000L);ForkJoinTask<Long> result = forkJoinPool.submit(task);try{long res = result.get();System.out.println("sum="+res);}catch (InterruptedException e){e.printStackTrace();}catch (ExecutionException e){e.printStackTrace();}}
}

构造一个1到200 000求和的任务。
在ForkJoinTask<Long> result = forkJoinPool.submit(task);提交任务给线程池,
线程池会返回一个携带结果的任务,通过get()方法可以得到最终结果。
如果在执行get()方法时任务没有结束,那么主线程就会在get()方法时等待。


CountTask的实现,首先CountTask继承自RecursiveTask类,
可以携带返回值,这里的返回值类型设置为long类型,
THRESHOLD设置了任务分解的规模,也就是如果需要求和的总数大于
THRESHOLD个,那么任务就需要再次分解,否则
就可以直接执行。
如果和我可以直接执行,那么直接进行求和,返回结果。
否则,就对任务再次分解。每次分解时,简单地将原有任务分解成
100个等规模的小任务,并使用fork方法提交子任务。
之后,等待所有的子任务结束,
并将结果再次求和(  for(CountTask t:subTasks){
                sum+= t.join();
            })


http://www.ppmy.cn/news/1279136.html

相关文章

VideoPoet: Google的一种用于零样本视频生成的大型语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

网站页面速度优化的 7 个有力步骤

在本指南中 为什么页面速度在SEO中很重要&#xff1f;页面速度如何帮助您在 Google 搜索结果中排名更高您如何检查 Core Web Vitals&#xff1f;每个核心网络生命力是什么意思&#xff1f;快速网站如何降低成本 第 1 步&#xff1a;运行网站性能测试第 2 步&#xff1a;设置网站…

Vue+ElementUI+nodejs学生宿舍报修管理系统68ozj

本站是一个B/S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中…

Linux 磁盘空间占满故障解决方法

故障排查&#xff1a; 使用命令查看磁盘使用量 # 使用人类可读的格式(预设值是不加这个选项的...) df -h # --inodes 列出 inode 资讯&#xff0c;不列出已使用 block df -i # 查看当前目录下各个文件及目录占用空间大小 du -sh / 情况一&#xff1a;一般磁盘空间满了&a…

Linux DISK赛题配置

DISK 查看 lsblk //查看分区和磁盘信息 fdisk -l //分区工具查看分区信息 free -h //查看内存大小重新扫描SCSI&#xff08;添加了硬盘不会马上显示&#xff09; echo "- - -" > /sys/class/scsi_host/host0/scan //第一条一般都会出现 echo "- - …

【K8s】1# 使用kuboard-spray安装K8s集群

文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1&#xff1a;启动离线集…

软件工程中关键的图-----知识点总结

目录 1.数据流图 2.变换型设计和事务型设计 3.程序流程图 4.NS图和PAD图&#xff1a; 5.UML图 1.用例图 2.类图 3.顺序图 4.协作图 本文为个人复习资料&#xff0c;包含个人复习思路&#xff0c;多引用&#xff0c;也想和大家分享一下&#xff0c;希望大家不要介意~ …

得到山形数组的最少删除次数(LeetCode日记)

LeetCode-1671-得到山形数组的最少删除次数 题目信息: 我们定义 a r r arr arr 是 山形数组 当且仅当它满足&#xff1a; a r r . l e n g t h > 3 arr.length > 3 arr.length>3存在某个下标 i i i &#xff08;从 0 开始&#xff09; 满足 0 < i < a r r…