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

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.hqwc.cn/news/296623.html

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

相关文章

实习课知识整理3:首页商品列表的展示

对于一个购物商城的项目&#xff0c;主体还得是商品&#xff0c;这篇博客主要介绍如何将数据库中的信息渲染到页面上&#xff0c;这边后端是SpringBoot,前端是html配合thymeleaf模板 1. 编写查询数据库的方法 在这边我在页面上需要两部分的信息&#xff0c;一个是所有的商品&am…

vue前端上传图片到阿里云OSS,超详细上传图片与视频教程

vue前端直传图片与视频到阿里云OSS 1. 简介与日常使用2. 为什么要这么干&#xff1f;是因为我司后端不行吗&#xff1f;&#xff1f;&#xff1f;&#xff08;确实&#xff01;&#xff09;3. vue前端直传的操作4. 如何上传到阿里OSS指定文件夹呢? 1. 简介与日常使用 阿里云…

html5实现最智能大气的公司年会抽奖(源码)

文章目录 1.设计来源1.1 主界面1.3 数据配置1.4 抽奖效果1.5 中奖效果 2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码2.6 项目结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Python字符串处理全攻略(三):常用内置方法轻松掌握

目录 引言Python字符串常用内置方法str.index()功能介绍语法注意事项总结 str.startswith()功能介绍语法示例注意事项 str.expandtabs()功能介绍语法示例注意事项总结 str.splitlines()功能介绍语法示例注意事项总结 str.swapcase()功能介绍语法示例注意事项 结束语 引言 欢迎…

Python数据分析 Matplotlib篇 基本方法初识 (第1讲)

Python数据分析 Matplotlib篇(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

《每天一分钟学习C语言·八》字符串,指针与二维数组,补码,按位取反

1、 枚举 enum WeekDay //这是一个数据类型 {//MonDay, TusDay,.... }; enum WeekDay day MonDay; printf(“%d\n”, day); //输出0&#xff0c;枚举里面元素都是从0开始排列2、 字符串 &#xff08;1&#xff09;在字符串中加双引号前面需要有反斜杠 &#xff08;2&#xf…

深入探讨多模态模型和计算机视觉

近年来&#xff0c;机器学习领域在从图像识别到自然语言处理的不同问题类型上取得了显着进展。然而&#xff0c;这些模型中的大多数都对来自单一模态的数据进行操作&#xff0c;例如图像、文本或语音。相比之下&#xff0c;现实世界的数据通常来自多种模态&#xff0c;例如图像…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

vue的表单收集案例

Vue的表单收集案例 这只是最基础的表单收集&#xff0c;并未涉及到element-ui。 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>收集表单数据</title><script type"text/javascript" src"../js…

美好的⼀天 从ActionTab开始 美观、智能、⾼效的新标签⻚ iTab 新标签页iTab新标签页Atop100工具推荐

文章目录 ActionTabiTab 新标签页iTab新标签页&#xff0c;小组件&#xff0c;起始页&#xff0c;标签页&#xff0c;日历&#xff0c;股票&#xff0c;浏览器扩展 https://www.actiontab.cn/ ActionTab 收费&#xff1f;&#xff1f;&#xff1f;&#xff1f; iTab 新标签页iT…

docker-compaose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

嵌入式-stm32-用PWM点亮LED实现呼吸灯

一&#xff1a;知识前置 1.1、LED灯怎么才能亮&#xff1f; 答&#xff1a;LED需要低电平才能亮&#xff0c;高电平是灯灭。 1.2、LED灯为什么可以越来越亮&#xff0c;越来越暗&#xff1f; 答&#xff1a;这是用到不同占空比来实现的&#xff0c;控制LED实现呼吸灯&…